关于C#:边际时间的夏令时更改计划触发器

Daylight Saving Time change schedule trigger for a marginal time

我正在编写一个调度应用程序,我很好奇如何处理有关夏令时(DST)更改的以下边缘情况:

比如说,我们正处于DST的时区:

  • 2014-Mar-9开始,在2:00:00 AM开始(时钟向前调整)
  • 2:00:00 AM2014-Nov-2上结束(时钟向后调整)

假设,最终用户为2014-Nov-2, 2:00:00 AM安排了我的应用程序。

假设现在的本地日期/时间是2014-Nov-2, 1:59:99 AM

我的应用程序应该在什么时候启动时间表——在1秒内,还是在1小时1秒内?

是否有一个标准定义了如何处理这种情况?


根据维基百科,夏令时的规则是:

...in spring the clock jumps forward from the last moment of 01:59
standard time to 03:00 DST and that day has 23 hours, whereas in
autumn the clock jumps backward from the last moment of 01:59 DST to
01:00 standard time, repeating that hour, and that day has 25
hours.[37] A digital display of local time does not read 02:00 exactly
at the shift to summertime, but instead jumps from 01:59:59.9 forward
to 03:00:00.0.

因此,尽管世界各地的时间和日期不同,但规则是相似的(忽略了澳大利亚的豪勋爵岛使用半小时轮班)。向后或向前跳跃的时间不被触摸,而是跳到的时间。

所以在我看来,你应该在一个小时一秒钟内触发计划。

如果您在一秒钟内触发它,并且用户希望在3点钟停止计划,那么它将运行两个小时而不是一个看起来不正确的时间(2-3=1小时)。


我同意所有关于"你应该做什么"的评论都高度依赖于你的用户的期望,但是我还是会给出我的意见。

如果计划单个事件,则应该能够测试用户提供的日期和时间,以查看它是否无效(在SpringDST转换中)或不明确(在FallDST转换中)。在无效情况下,提示"对不起,时间无效"。在模棱两可的情况下,提示类似"您是指1:30 PDT(UTC-7)还是1:30 PST(UTC-8)"?并进行相应的选择。

但是我将从一个经常性事件的用例来处理您的问题,比如每天同时触发的一个闹钟。作为闹钟的使用者,我会期待什么?

  • 如果我把每天的时间安排在凌晨2:00,但在春运期间,时钟从1:59:59变为3:00:00,我希望闹钟会在3:00:00响。我当然不想让它在4:00:00起飞——那将是一个额外的小时。我也不想仅仅因为2:00在技术上没有发生就不报警。

  • 如果我每天安排一个时间在凌晨1:00,但在秋季转换时,时钟从1:59:59变回1:00:00-作为此闹钟的用户,我希望它只在第一次出现(夏令时)时关闭。发生两次会很烦人。

    但在这里,我们看到了这如何说明需要了解用户的期望。如果我能告诉闹钟让我再多等一个小时呢?"请闹钟先生,我想用额外的夏令时晚睡。在第二次1:00的时候把我叫醒。"—现在我个人还没有见过这样工作的闹钟,但我想你明白我的意思。

现在也许你不在使用闹钟。也许这是一个定时电汇或其他一些时间敏感的项目。你应该研究预期的逻辑,看看什么对你有意义。

请注意,DST规则因时区而异。世界并非同时进行DST。很多事情根本做不到。

有关DST行为的更多信息,请参阅DST标记wiki中的图表。