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

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

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

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

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

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

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

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

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


当前回答

对于网络来说,规则没有那么复杂。。。

服务器端,使用UTC客户端,使用Olson原因:UTC偏移量不是夏令时安全的(例如,纽约是一年中的EST(UTC-5小时)部分,EDT(UTC-4小时)部分)。对于客户端时区确定,您有两个选项:1) 用户设置区域(更安全)资源:Web就绪的Olson-tz HTML下拉列表和JSON2) 自动检测区域资源:jsTimezoneDetect

剩下的只是使用服务器端日期时间库进行UTC/本地转换。很好去。。。

其他回答

明确关注点的架构分离-准确地知道哪个层与用户交互,并且必须更改规范表示(UTC)的日期时间。非UTC日期时间是表示(遵循用户本地时区),UTC时间是模型(对于后端和中间层仍然是唯一的)。

此外,决定你的实际受众是什么,你不需要服务什么,你在哪里划分界限。除非你在那里有重要的客户,否则不要接触异国情调的日历,然后考虑为该地区单独的面向用户的服务器。

若您可以获取并维护用户的位置,则可以使用位置进行系统的日期时间转换(例如.NET区域性或SQL表),但如果日期时间对您的用户至关重要,则为最终用户提供一种选择覆盖的方式。

如果涉及历史审计义务(例如准确地告诉亚利桑那州的Jo在2年前的9月支付账单的时间),则记录UTC和当地时间(您的转换表会随着时间的推移而改变)。

为批量提供的数据(如文件、web服务等)定义时间参考时区。如果东海岸公司在加利福尼亚州设有数据中心,您需要询问并了解他们使用什么作为标准,而不是假设其中之一。

不要相信嵌入在日期时间文本表示中的时区偏移,也不要接受解析和跟踪它们。相反,始终要求明确定义时区和/或参考区域。你可以很容易地用PST偏移量接收时间,但时间实际上是EST,因为这是客户端的参考时间,记录只是在PST中的服务器上导出的。

对于网络来说,规则没有那么复杂。。。

服务器端,使用UTC客户端,使用Olson原因:UTC偏移量不是夏令时安全的(例如,纽约是一年中的EST(UTC-5小时)部分,EDT(UTC-4小时)部分)。对于客户端时区确定,您有两个选项:1) 用户设置区域(更安全)资源:Web就绪的Olson-tz HTML下拉列表和JSON2) 自动检测区域资源:jsTimezoneDetect

剩下的只是使用服务器端日期时间库进行UTC/本地转换。很好去。。。

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

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

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

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

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

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

汤姆·斯科特(Tom Scott)在《计算机爱好者》频道的YouTube上关于时区的视频也对这一话题进行了精彩有趣的描述。示例包括:

萨摩亚(太平洋中的一个岛屿)将其时区提前24小时,以便于与澳大利亚和新西兰的贸易,西岸有两个人口在不同的时区,18世纪从儒略历到格里高利历的变化日历(发生在20世纪的俄罗斯)。