夏令时时间差距/重叠定义?啥时候为他们“纠正”?
Posted
技术标签:
【中文标题】夏令时时间差距/重叠定义?啥时候为他们“纠正”?【英文标题】:Daylight Savings Time Gap/Overlap definitions? When to "correct" for them?夏令时时间差距/重叠定义?什么时候为他们“纠正”? 【发布时间】:2016-10-29 18:06:25 【问题描述】:夏令时“重叠”和“差距”的定义是什么? 我对它们的理解很模糊,所以我想确认一下……“在”它们中的任何一个是什么意思?
“纠正”夏令时差距或夏令时重叠是什么意思?什么时候需要纠正,什么时候不需要纠正?
上述问题与语言无关,但我的应用示例如下:
-
何时致电org.joda.time.LocalDateTime#correctDstTransition?
在 DST 重叠的情况下正确日期。创建的 Date 对象有 与此日期时间完全相同的字段,除非时间会 由于夏令时差距而无效。在这种情况下,时间将 设置为间隙后的最早有效时间。在一个 夏令时重叠,选择较早的时刻。
【问题讨论】:
我认为您可以对此进行推理。当时间从 01:59:59 到 03:00:00 时,你在春天有什么?一个间隙,因为他们之间有一个小时长的空间,时间似乎不存在。在秋天,时间从 01:59:59 到 01:00:00 你有什么?重叠 60 分钟,其中有两个 01:00:00、两个 01:30:00 等。 【参考方案1】:the DST tag wiki 已经解释了大部分内容,但我会回答您的具体问题。
夏令时“重叠”和“差距”的定义是什么? ... “在”他们中的任何一个是什么意思?
夏令时开始时,当地时间会提前 - 通常提前一小时。这会在该时区的本地时间值中产生“差距”。
例如,当 DST 在美国开始时,时钟从凌晨 1:59 到凌晨 3:00 滴答作响。从凌晨 2:00 到凌晨 2:59 的任何当地时间值都将被视为“在间隙内”。
请注意,间隙中的值不存在。它们不会出现在现实世界中,除非时钟没有正确提前。在实践中,通常通过从另一个本地时间加上或减去一个经过的时间值来得到一个在间隙内的值。
当夏令时结束时,本地时间会按开始时增加的相同时间缩回(同样,通常为 1 小时)。这会在该时区的本地时间值中产生“重叠”。
例如,当 DST 在美国结束时,时钟会从凌晨 1:59 回到凌晨 1:00。如果没有额外的限定信息,则从凌晨 1:00 到凌晨 1:59 的任何当地时间值不明确。
“在重叠范围内”意味着您的值可能不明确,因为它属于此范围。
这些值可能属于日光时间(依次出现第一个),或者可能属于标准时间发生(按顺序发生秒)。
“更正”DST Gap 或 DST Overlap 是什么意思?
校正间隙意味着通过可能将本地时间值移动到不同的值来确保本地时间值有效。有多种方案可以做到这一点,但最常见和最明智的做法是将本地时间值提前间隙量。
例如,如果您的当地时间是凌晨 2:30,并且您确定它发生在美国春季向前过渡的那一天,那么它就会落入间隙中。提前到凌晨 3:30。
这种方法往往效果很好,因为它模拟了人类手动推进模拟时钟的行为 - 或者更确切地说,纠正没有正确推进的想法。
对重叠进行校正意味着确保所有当地时间都是合格的。通常这是通过为所有值分配时区偏移量来实现的。
在值不明确的情况下,偏移量是确定性的。
如果值在回退转换当天落入重叠范围内,通常选择两个可能值中的第一个(这将有 daylight 时间偏移)。这是因为时间向前移动。但是,有时使用不同的规则是有意义的,所以 YMMV。
什么时候需要修正,什么时候不需要修正?
如果您尝试将时间用作瞬时值,例如确定两个值之间经过的持续时间、将经过的时间添加到特定值或转换为 UTC 时,则需要纠正间隙和重叠当它们发生时。
如果您只处理用户输入和输出,始终显示用户给您的确切值(并且从不将其用于数学或时区转换),那么您不需要纠正间隙和重叠。
此外,如果您正在使用仅日期值或仅时间值,则根本不应该应用时区信息,因此不需要更正间隙和重叠。
最后,如果您严格使用没有夏令时的协调世界时 (UTC),则无需校正间隙和重叠。
什么时候打电话给
org.joda.time.LocalDateTime#correctDstTransition
?
你没有。该方法是private
,并根据需要由其他 Joda-time 函数调用。
【讨论】:
感谢您抽出宝贵时间,@MattJohnson 以及 DST 标签 wiki 链接!以上是关于夏令时时间差距/重叠定义?啥时候为他们“纠正”?的主要内容,如果未能解决你的问题,请参考以下文章