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

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

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

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

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

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

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

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

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


当前回答

还有一件事,确保服务器应用了最新的夏令时补丁。

去年,我们遇到了这样一种情况,北美用户在三周内的时间里,即使我们使用的是基于UTC的系统,我们的时间也总是比以前少一个小时。

最后证明是服务器。他们只需要应用最新的修补程序(Windows Server 2003)。

其他回答

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

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

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

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

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

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

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

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

商业规则应始终适用于民事诉讼时间(除非法律另有规定)。请注意,公民时间是一团糟,但这是人们使用的时间,所以这才是最重要的。

在内部,将时间戳保持在从大纪元开始的民用时间秒中。纪元并不特别重要(我喜欢Unix纪元),但它确实比其他纪元更容易。假装闰秒不存在,除非你正在做一些真正需要它们的事情(例如,卫星跟踪)。时间戳和显示时间之间的映射是应用DST规则的唯一点;规则经常变化(在全球范围内,一年几次;指责政客),所以你应该确保你没有硬编码地图。奥尔森的TZ数据库是无价的。

您正在使用.NET框架吗?如果是这样的话,让我向您介绍一下与.NET3.5一起添加的DateTimeOffset类型。

此结构同时包含DateTime和Offset(TimeSpan),后者指定DateTimeOffset实例的日期和时间与协调世界时(UTC)之间的差异。

DateTimeOffset.Now静态方法将返回DateTimeOffset由当前(本地)时间和本地偏移组成的实例(如操作系统的区域信息中所定义)。DateTimeOffset.UtcNow静态方法将返回DateTimeOffset实例包含UTC中的当前时间(如如果你在格林威治)。

其他有用的类型是TimeZone和TimeZoneInfo类。

对于那些在.NET上挣扎的人,看看使用DateTimeOffset和/或TimeZoneInfo是否值得。

如果您想使用IANA/Olson时区,或者发现内置类型不足以满足您的需要,请查看Noda time,它为.NET提供了更智能的日期和时间API。