我希望将这个问题及其答案作为处理夏令时的最终指南,特别是处理实际转换时。

如果你有什么要补充的,请做

许多系统都依赖于保持准确的时间,问题是由于夏时制而导致的时间变化——向前或向后移动时钟。

例如,一个订单接受系统中的业务规则取决于订单的时间——如果时钟发生变化,规则可能就不那么清晰了。应如何保持订单的时间?当然,有无数的场景——这只是一个例证。

你是如何处理日光节约问题的?您的解决方案包含哪些假设?(在此处查找上下文)

同样重要,如果不是更重要的话:

你尝试了什么但没有奏效?为什么不起作用?

我会对编程、操作系统、数据持久性和其他相关方面感兴趣。

一般的答案很好,但我也希望看到细节,特别是如果它们只在一个平台上提供的话。


当前回答

仅举一个例子来证明,处理时间是描述的巨大混乱,你永远不会自满。在本页的几个地方,闰秒被忽略了。

几年前,Android操作系统使用GPS卫星获取UTC时间参考,但忽略了GPS卫星不使用闰秒的事实。没有人注意到,直到除夕夜出现了混乱,苹果手机用户和安卓手机用户相隔约15秒进行倒计时。

我想它已经被修复了,但你永远不知道这些“小细节”什么时候会回来困扰你。

其他回答

我只想指出两件似乎不准确或至少令人困惑的事情:

始终按照统一的标准坚持时间,而不是受夏令时影响。GMT和UTC已被不同的人,尽管UTC似乎最常被提及。

对于(几乎)所有实际的计算目的来说,UTC实际上是GMT。除非你看到一个分数秒的时间戳,否则你要处理的是GMT,这使得这种区分变得多余。

在以下情况下按原样包括本地时间偏移(包括DST偏移):存储时间戳。

时间戳始终以GMT表示,因此没有偏移量。

对于PHP:

PHP>5.2中的DateTimeZone类已经基于其他人提到的Olson DB,因此,如果您在PHP中而不是在DB中进行时区转换,则不必使用(难以理解的)Olson文件。

然而,PHP的更新频率不如Olson DB,因此仅使用PHPs时区转换可能会给您留下过时的DST信息,并影响数据的正确性。虽然这种情况预计不会经常发生,但如果您在全球拥有大量用户,这种情况可能会发生。

要解决上述问题,请使用timezonedb pecl包。它的功能是更新PHP的时区数据。根据更新的频率安装此软件包。(我不确定这个软件包的更新是否完全遵循奥尔森的更新,但它的更新频率似乎至少非常接近奥尔森更新的频率。)

永远不要在没有UTC偏移(或时区参考)的情况下存储本地时间-如何不这样做的示例包括C¹中的FAT32和结构tm了解时区是一组UTC偏移(例如,冬季+0100,夏季+0200)切换发生的时间规则(可能会随着时间的推移而改变:例如,在20世纪90年代,欧盟将切换统一为3月和10月的最后一个星期日,标准时间02:00/夏令时03:00;之前成员国之间有所不同)。


¹struct tm的一些实现确实存储UTC偏移量,但这并未将其纳入标准。

如果您碰巧维护的数据库系统在DST活动的情况下运行,请仔细检查它们是否需要在秋季过渡期间关闭。Mandy DBS(或其他系统)不喜欢在同一时间点(本地)两次通过,这正是当你在秋天将时钟拨回时发生的情况。SAP采用了一种(IMHO真的很好)变通方法解决了这一问题——他们没有让时钟倒转,而是让内部时钟以正常速度的一半运行两个小时。。。

跨越“计算机时间”和“人类时间”的界限是一场噩梦。主要原因是,时区和夏令时的规则没有一种标准。各国可以随时自由更改时区和夏令时规则,他们也可以这样做。

一些国家,例如以色列、巴西,每年都会决定何时实行夏令时,因此无法提前知道夏令时何时生效。其他人对DST何时生效有固定的规则。其他国家并不完全使用夏令时。

时区不必与格林尼治标准时间相差整整一小时。尼泊尔为+5.45。甚至还有+13的时区。这意味着:

SUN 23:00 in Howland Island (-12)
MON 11:00 GMT 
TUE 00:00 in Tonga (+13)

都是同一时间,但3天不同!

对于时区的缩写,以及它们在夏令时中的变化,也没有明确的标准,因此您最终会遇到这样的情况:

AST Arab Standard Time     UTC+03
AST Arabian Standard Time  UTC+04
AST Arabic Standard Time   UTC+03

最好的建议是尽可能远离当地时间,尽可能坚持UTC。仅在最后一刻转换为当地时间。

测试时,请确保您测试了西半球和东半球的国家,其中既有正在进行的夏令时,也有未使用夏令时的国家(共6个)。