【问题标题】:Handling Daylight Saving Time for scheduling purposes为调度目的处理夏令时
【发布时间】: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 将消除任何混乱
  • 仅供参考 - 没有“格林威治标准时间”之类的东西。这是微软发明的术语。在现实生活中,它通常被称为“英国夏令时”。

标签: date datetime utc dst


【解决方案1】:

我在这里看到的唯一真正的问题是:

这是否表明 API 应该知道用户的时区,以便 API 中的周期生成逻辑可以在计算开始日期和结束日期时考虑到这一点?

一般来说,答案是。每当您将日历日期映射回特定的时间点时,根据定义,您必须涉及时区。该时区可以是用户的时区,也可以是某个特定业务位置的时区,或者固定为 UTC,但它们确实是逻辑的一部分。

请注意,并非每个日历日期在每个时区都有一个有效的本地“午夜”。一个例子是 2015 年 10 月 18 日在巴西圣保罗,由于他们的春季夏令时转换,当天的第一时刻是凌晨 1:00。世界各地还有很多其他这样的例子。

完全避免该问题的唯一方法是不在特定时间处理。如果您只使用整个日期,那么您的代码当然可以计算每个月的确切日期,而无需了解时区。 2016-01-012016-01-31 不知道时间或时区。仅当您尝试询问 当前 日期是什么,或者 now 是否在该范围内,或者是否有其他特定的 instant 时间是在你必须开始考虑时区的范围内。

【讨论】:

    猜你喜欢
    • 2018-03-18
    • 2019-12-16
    • 2013-03-18
    • 2022-07-20
    • 2019-09-29
    • 2012-11-21
    • 2017-03-17
    • 2015-04-09
    • 2012-11-07
    相关资源
    最近更新 更多