我正在编写一个调度应用程序,我很好奇如何处理以下有关夏令时(DST)更改的边缘情况:
说,我们在DST的时区:
2014-Mar-9
2:00:00 AM
开始(时钟向前调整)2014-Nov-2
的{{1}}结束(时钟向后调整)假设最终用户为2:00:00 AM
安排了我的应用。
我们假设现在的本地日期/时间是2014-Nov-2, 2:00:00 AM
。
我的应用应该何时开始计划 - 1秒钟,1小时1秒?
是否有标准定义如何处理这种情况?
答案 0 :(得分:3)
根据wikipedia,夏令时的规则是:
...在春天,时钟从01:59的最后一刻向前跳跃 标准时间到夏令时间03:00,那天有23个小时,而在 秋天时钟从01:59 DST的最后一刻向后跳跃到 01:00标准时间,重复那个小时,那天有25个 小时。[37]当地时间的数字显示不准确读取02:00 在转移到夏季,但转而从 01:59:59.9向前跳 到03:00:00.0 。
因此,虽然世界各地的时间和日期不同,但规则相似(忽略澳大利亚的豪勋爵岛,它使用了半小时的班次)。不会触及向后或向前跳跃的小时,而是跳到的小时。
因此,在我看来,你应该在一小时一秒内触发计划。
如果您在一秒钟内触发它并且用户想要在3点钟停止计划,它将运行两个小时而不是一个看起来不正确的(2-3 = 1小时)。
答案 1 :(得分:1)
我同意所有评论"你应该做什么"高度依赖于用户的期望,但无论如何我都会发表意见。
如果您要安排单个事件,您应该能够测试用户提供的日期和时间,看它是否无效(在春季DST过渡期间),或者暧昧(在秋季DST过渡期)。在无效的情况下,提示类似"抱歉,该时间无效"。在模棱两可的情况下,提示类似于"您的意思是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点没有技术发生而根本不想发出警报。
如果我在凌晨1:00安排每日时间,但在秋季过渡期间,时钟从1:59:59 返回到1:00:00 - 作为用户这个警报,我希望它仅在第一次发生(白天时间)时消失。发生两次只会令人讨厌。
但在这里,我们看到这说明需要了解用户的期望。如果我可以告诉我的闹钟让我多休一小时怎么办? "请闹钟先生,我想用我额外的DST小时睡一觉。在1点的第二次事件中唤醒我。" - 现在我还没有亲眼见过任何以这种方式工作的闹钟,但我认为你明白我的观点。
现在也许您还没有使用闹钟。也许这是一个定时的电汇或其他一些时间敏感的项目。您应该完成预期的逻辑并看看对您有意义的事情。
请注意,DST规则因时区而异。世界并没有同时做所有的夏令时。其中大部分都没有做到。
有关DST行为的更多信息,请参阅DST tag wiki中的图表。