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

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

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

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

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

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

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

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

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


当前回答

对于在服务器上运行的应用程序(包括网站和其他后端服务),应用程序应忽略服务器的时区设置。

常见的建议是将服务器的时区设置为UTC。这确实是一个很好的最佳实践,但对于不遵循其他最佳实践的应用程序来说,这是一个创可贴。例如,服务可能使用本地时间戳而不是基于UTC的时间戳写入日志文件,从而在夏时制回退转换期间产生歧义。将服务器的时区设置为UTC将修复该应用程序。然而,真正的解决办法是应用程序首先使用UTC进行日志记录。

服务器端代码(包括网站)不应期望服务器的本地时区是任何特定的。

在某些语言中,本地时区很容易进入应用程序代码。例如,.NET中的DateTime.ToUniversalTime方法将从本地时区转换为UTC,DateTime.Now属性返回本地时区中的当前时间。此外,JavaScript中的Date构造函数使用计算机的本地时区。像这样的例子还有很多。练习防御性编程很重要,避免任何使用计算机本地时区设置的代码。

使用本地时区保留客户端代码,如桌面应用程序、移动应用程序和客户端JavaScript。

其他回答

在处理存储在FAT32文件系统中的时间戳时要小心——它总是保存在本地时间坐标中(包括DST——请参阅msdn文章)。被那一块烧伤了。

以下是我的经验:-

(不需要任何第三方库)

在服务器端,以UTC格式存储时间,以便数据库中的所有日期/时间值都采用单一标准,而不考虑用户、服务器、时区或DST的位置。在UI层或发送给用户的电子邮件中,您需要根据用户显示时间。为此,您需要有用户的时区偏移量,以便将此偏移量添加到数据库的UTC值中,这将导致用户的本地时间。您可以在用户注册时获取他们的时区偏移,也可以在web和移动平台中自动检测他们。对于网站,JavaScript的函数getTimezoneOffset()方法是1.0版以来的标准,并且与所有浏览器兼容。(参考:http://www.w3schools.com/jsref/jsref_getTimezoneOffset.asp)

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

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

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

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

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

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

如果您的设计能够适应,请避免同时转换本地时间!

我知道对一些人来说,这可能听起来很疯狂,但想想用户体验:用户处理接近的相对日期(今天、昨天、下周一)比绝对日期(2010.09.17,星期五-9月17日)的速度要快。当你仔细考虑时,时区(和DST)的准确度越接近现在()就越重要,所以如果你可以用+/-1或2周的相对格式表示日期/日期时间,其余的日期可以是UTC,这对95%的用户来说并不重要。

通过这种方式,您可以以UTC存储所有日期,并以UTC进行相对比较,只需向用户显示超出相对日期阈值的UTC日期。

这也适用于用户输入(但通常以更有限的方式)。从只有{昨天、今天、明天、下周一、下周四}的下拉列表中进行选择,对于用户来说,比日期选择器更简单、更容易。日期选择器是表单填充中最令人痛苦的部分。当然,这并不适用于所有情况,但您可以看到,它只需要一点巧妙的设计就可以使其非常强大。