首页 文章

夏令时更改计划触发边际时间

提问于
浏览
4

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

说,我们在DST的时区:

  • 2014-Mar-9 2:00:00 AM 开始(时钟向前调整)

  • 2014-Nov-2 结束于 2:00:00 AM (时钟向后调整)

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

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

什么时候我的应用程序应该在1秒内,或在1小时1秒内启动计划?

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

2 回答

  • 1

    根据wikipedia,夏令时的规则是:

    ...在 Spring 天,时钟从标准时间01:59的最后一刻向前跳到夏令时间03:00,那天有23个小时,而在秋天,时钟从夏令时01:59的最后一刻向后跳跃到01 :00标准时间,重复那个小时,那天有25个小时 . [37]本地时间的数字显示在夏季的转换时不会准确读取02:00,而是从01:59:59.9跳转到03:00:00.0 .

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

    因此,在我看来,你应该在一小时一秒内触发计划 .

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

  • 3

    我同意所有的评论“你应该做什么”高度依赖于用户的期望,但无论如何我都会发表意见 .

    如果您正在安排单个事件,您应该能够测试用户提供的日期和时间,以查看它是否无效(在 Spring 季DST过渡期间)或模糊(在秋季DST过渡期间) . 在无效的情况下,提示类似"sorry, that time is invalid" . 在不明确的情况下,提示类似"did you mean 1:30 PDT (UTC-7) or 1:30 PST (UTC-8)?"的内容并相应地处理选择 .

    但是我会从一个反复出现的事件的用例中解决你的问题,例如每天同时发出的闹钟 . 作为闹钟用户我会期待什么?

    • 如果我安排每天上午2:00的时间,但是在 Spring 季过渡时间从1:59:59到3:00:00,我想要它在4:00:00熄灭 - 那个会是一个额外的一小时 . 我也不会在技术上发生 .

    • 如果我在凌晨1:00安排每日时间,但是在秋季过渡时钟从1:59:59回到1:00:00 - 作为此警报的用户,我希望它会在第一次出现(白天时间) . 发生两次只会令人讨厌 .

    但在这里,我们看到这说明需要了解用户的期望 . 如果我可以告诉我的闹钟让我多休一小时怎么办? “请闹钟先生,我想用我额外的DST小时睡一觉 . 在第二次发生的1点叫醒我 . ” - 现在我没有亲眼见过任何以这种方式工作的闹钟,但我认为你明白我的观点 .

    现在也许你没有使用闹钟 . 也许这是一个定时的电汇或其他一些时间敏感的项目 . 您应该完成预期的逻辑并看看对您有意义的事情 .

    请注意,DST规则因时区而异 . 世界并没有同时做所有的夏令时 . 其中大部分都没有做到 .

    有关DST行为的更多清晰度,请参阅DST tag wiki中的图表 .

相关问题