【发布时间】:2016-10-05 00:10:25
【问题描述】:
我正在使用基于一组配置参数生成时间段的 API。
例如,我可以指定我想要从 1 月 1 日午夜开始的 12 个一个月期,因此 API 将生成 12 个月期
01 Jan 2016 00:00:00 – 31 Jan 2016 23:59:59
01 Feb 2016 00:00:00 – 28 Feb 2016 23:59:59
Through to
01 Dec 2016 00:00:00 – 31 Dec 2016 23:59:59
现在 API 期望为周期序列提供的开始日期参数是 UTC 格式的 ISO 格式字符串。所以我目前在英国,因此如果我选择从 2016 年 1 月 1 日开始每月周期,这将是 2016-01-01T00:00:00Z 并且是我提供给 API 调用的内容应该开始了。
所以现在如果我通过 API 查看生成的每月周期的开始和结束日期,我会看到它们返回为
2016-01-01T00:00:00Z - 2016-01-31T23:59:59Z
2016-02-01T00:00:00Z - 2016-02-28T23:59:59Z
Etc to
2016-12-01T00:00:00Z - 2016-12-31T23:59:59Z
这些生成的周期让我印象深刻,那就是我希望它们在我目前所在的位置的午夜开始,但是受 GMT 夏令时影响的周期,所以说我的四月周期在生成的周期中看起来像这样来自 API
2016-04-01T00:00:00Z - 2016-04-30T23:59:59Z
将上述的开始日期解析为日期对象以在客户端(在我的机器上)中查看将显示为
Fri Apr 01 2016 01:00:00 GMT+0100 (GMT Daylight Time)
也就是说,这段时间从凌晨 1 点开始,而不是午夜。 现在说如果我希望从夏令时生效的 6 月 1 日开始生成 12 个月。
我的客户端代码目前将为2016-05-31T23:00:00Z 的API 提供开始日期。这会导致 API 生成每个月的开始日期为
2016-05-31T23:00:00Z - 2016-06-31T22:59:59Z (June Period)
2016-06-31T23:00:00Z - 2016-07-31T22:59:59Z (July)
Etc to
2017-04-30T23:00:00Z - 2017-05-31T22:59:59Z (May)
但现在在 GMT 夏令时以外的时间段内,例如 Jan,它将显示为
2016-12-31T23:00:00Z - 2017-01-31T22:59:59Z
意味着我的客户将看到开始日期为
Sat Dec 31 2016 23:00:00 GMT+0000 (GMT Standard Time)
所以不是 1 月 1 日 00:00
这是否表明 API 应该知道用户的时区,以便 API 中的周期生成逻辑可以在计算开始日期和结束日期时考虑到这一点?
也许我在这里想太多了?!
【问题讨论】:
-
使用的时间段是什么?就我个人而言,我会坚持使用 UTC(GMT) 并完成它。消除所有混乱。
-
它们用于分配在这些生成期间发生的事件。
-
这些事件是否需要考虑夏令时?
-
说实话,我不能 100% 确定,我需要与编写 API 的团队核实。我想如果答案是否定的,那么正如你所说,在整个过程中使用 UTC 将消除任何混乱
-
仅供参考 - 没有“格林威治标准时间”之类的东西。这是微软发明的术语。在现实生活中,它通常被称为“英国夏令时”。