【发布时间】:2021-12-28 00:36:05
【问题描述】:
我有来自多个时区的用户,并将时间以 UTC 格式存储在数据库中。 单独遇到时间部分的问题。
按如下方式存储一周的用户工作时间。
| Id | UserId | Day | StTime | EndTime |
|---|---|---|---|---|
| 1 | 1 | 0 | 10:00 | 18:00 |
| 2 | 1 | 1 | 10:00 | 18:00 |
| 3 | 1 | 2 | 10:00 | 18:00 |
| 4 | 1 | 3 | 10:00 | 18:00 |
| 5 | 1 | 4 | 10:00 | 18:00 |
星期,0 代表星期日,1 代表星期一,...
在这里,时间以 UTC 格式存储。时间正在根据浏览器时区在 UI 中进行转换。由于此处不需要日期部分,因此此处会引起问题。
例如,假设用户在 UI 中选择上午 7 点到下午 7 点,时间会转换为 UTC,即今天 15:00 到明天 02:00。因此,在 DB 中,时间被存储为
| Id | UserId | Day | StTime | EndTime |
|---|---|---|---|---|
| 1 | 1 | 0 | 15:00 | 02:00 |
| 2 | 1 | 1 | 15:00 | 02:00 |
| 3 | 1 | 2 | 15:00 | 02:00 |
| 4 | 1 | 3 | 15:00 | 02:00 |
| 5 | 1 | 4 | 15:00 | 02:00 |
这里,开始时间大于结束时间,这是不正确的。
仅存储时间部分时,我们需要如何处理时区?
我的要求是根据以下信息为用户获取开放槽。
- 预定时段
- 阻塞槽
- 工作时间
BookedSlots,
| Id | userId | St_time(datetime) | duration(mins) |
|---|---|---|---|
| 1 | 1 | 2021-11-27 16:00:00 | 30 |
| 1 | 1 | 2021-11-27 18:00:00 | 45 |
这里的时间是 UTC。
- 被阻塞的插槽
| Id | userId | St_time | end_date | st_time | end_time |
|---|---|---|---|---|---|
| 1 | 1 | 2021-11-22 | 2021-11-25 | 09:00 | 18:00 |
| 1 | 1 | 2021-12-17 | 2021-12-20 | 09:00 | 18:00 |
这里也需要以UTC格式存储时间
- 工作时间
| Id | UserId | Day | StTime | EndTime |
|---|---|---|---|---|
| 1 | 1 | 0 | 15:00 | 02:00 |
| 2 | 1 | 1 | 15:00 | 02:00 |
| 3 | 1 | 2 | 15:00 | 02:00 |
| 4 | 1 | 3 | 15:00 | 02:00 |
| 5 | 1 | 4 | 15:00 | 02:00 |
我需要根据以上 3 条信息计算空位。但是,当我们将其存储在 UTC 中时,时间部分会令人困惑。处理这个问题的最佳方法是什么?
【问题讨论】:
-
你能进一步扩展吗?我不清楚实际问题是什么。 15:00列出的项目中没有开始时间;浏览器时间转换码在哪里?
-
@blurfus 更新了问题
-
“这里,开始时间大于结束时间,这是不正确的。” - 啊,但是你看,它是正确的!您使用的是 UTC,因此在 UTC 中,这些是正确的开始和结束时间。
-
如果开始时间大于结束时间,您不能只添加一天吗?否则,我认为这会变得有点复杂,因为您将本质上是本地时间(并且在某种意义上不是特定日期)的工作时间与时区(特定日期!甚至不确定在这里使用 UTC 是否最好)。
-
在这种情况下,您需要存储本地时间和时区。当地时间上午 7 点在 DST(夏令时)期间转换为与标准时间期间不同的 UTC 时间。对于使用夏令时的时区,但我想你不能排除某些用户在这样的时区生活和工作。
标签: datetime localization timezone utc timezone-offset