【发布时间】:2017-04-06 07:37:30
【问题描述】:
我们在 db 中有一个名为 Record 的表,其中包含一些记录。 它有下面的列
Id(uniqueidentifier)
SubmittedDate(DateTime)
RecordNumber(uniqueidentifier)
下面一行代表一行记录,
Id RecordNumber SubmittedDate
'CD458C6D-9F45-41C1-85D8-E3D8287A82B4', 'EBB5DE3A-4B14-4112-AF51-0F8367FE3383' '2016-11-02 08:27:17.300'
用户可以从任何时区提交记录。作为最佳实践的一部分,我们将 DateTime 保存为 UTC。 因此,根据用户时区,我们将日期时间转换为 UTC 并将其保存在表中。
现在,我必须将结果返回为用户按日期提交的记录数。 我们必须根据用户时区返回记录。
如果用户在 2016 年 11 月 22 日凌晨 01:00 提交了 10 条记录,并且在 2016 年 11 月 21 日没有提交任何记录,并且用户属于 IST 时区。 在服务器端,我们将 22Nov2016 01:00AM 转换为 IST 并将其存储为 21Nov2016 09:00PM UTC
当同一用户查询以获取 11 月 24 日过去 5 天的记录时,我们将当前用户时区的偏移量(即(+5:30))添加到 SubmittedDate 列并相应地获取记录。 因此,我们应该根据用户时区获得用户提交的正确记录数。 将 UTC 偏移量添加到 SubmittedDate 日期后,我将获得正确数量的记录,即 2016 年 11 月 22 日的 10 条记录。
当我们在夏令时期间更改 UTC 偏移量时,即当时区从 PST 转换为 PDT 时,此解决方案将不起作用,反之亦然。
为了克服这个问题,我们在用户提交记录时在用户表中添加了时区列
Id(唯一标识符) 提交日期(日期时间) 记录编号(唯一标识符) 提交时区(varchar)
所以,a) 当用户从夏令时开启的时区查询记录并且提交的记录在夏令时开启时也提交时,我们没有做任何事情来抵消。
b) 当用户从夏令时开启的时区查询记录并且提交的记录在夏令时关闭时提交时,在这种情况下,我们将增加 1 小时的偏移量。
c) 当用户从夏令时关闭的时区查询记录并在夏令时开启时提交记录时,在这种情况下,我们将 -1 小时添加到偏移量。
d) 当用户从夏令时关闭的时区查询记录并且提交的记录在夏令时关闭时也提交时,我们没有做任何事情来抵消。
这是处理不同时区的时区/夏令时的正确方法吗?
注意:我们正在确定提交的记录在夏令时时也提交,按列 SubmittedTimeZone 值的最后两个单词为“DAYLIGHT TIME” 比如“阿拉斯加夏令时间”、“东部夏令时间”
这里有可能在一个时区开启夏令时在另一个时区关闭。可能我们必须根据提交的日期和提交的时区列计算请求用户时区的偏移量。
【问题讨论】:
标签: c# sql datetime timezone timezone-offset