关于时区:Windows GetTimeZoneInformation时差与ISO网站或Google不匹配

Windows GetTimeZoneInformation time difference doesn't match ISO web site or Google

我的电脑是Windows 7 64位;我在美国东海岸(东部时间);"日期和时间"小程序 - 通过右键单击任务栏时钟并选择"调整日期/时间" - 标记我的时区"(UTC-05:00)东部时间(美国和加拿大)"和告诉我,夏令时在11月结束。 (对于那些后来出现的人来说,这是在四月份写完之后,我们做了"春季前进"以获得夏令时。)

调用Windows GetTimeZoneInformation或GetDynamicTimeZoneInformation API(后者仅在Vista或更高版本上可用)会返回300分钟,5小时的"偏差"值。 (偏差值不是负数,因为该值的doc表示"UTC =当地时间+偏差"。)

但是,如果我去ISO网站声称告诉我在我的计算机上的时间,它显示的时间与时钟匹配但结束-0400。 (我试图复制/粘贴它,但它很难,因为它每秒都会改变。)在Google中输入"当前时间utc"显示的时间也比这里的时钟时间早4(不是5)小时。

让我更加困惑 - 我有一个运行Windows Server 2008的EC2实例,其他人设置并且说是故意设置为GMT,因此根据服务器时钟记录的时间不会因夏令时间而导致1小时跳转。

当我连接到该服务器时,它显示的时间比我在这里看到的时间提前了5个小时。但其控制面板中的日期/时间小程序(与Windows 7不同)显示当前时区为"(GMT)格林威治标准时间(都柏林,爱丁堡,里斯本,伦敦)",但也有一个时区"(GMT)协调世界时" - UTC - 如果我将时区更改为(我认为是正确的),则偏移量为4小时。

Windows 7上的"时区设置"对话框(通过单击上面讨论的"日期和时间"小程序中的"更改时区..."按钮到达)具有标记为"(UTC)协调世界时"的时区(4小时)从现在开始)和"(UTC)都柏林,爱丁堡,里斯本,伦敦"(从现在起5小时)。

除了认为EC2实例的时区设置错误之外 - 应该将其设置为UTC而不是伦敦时间来实现上述目标 - 我对此并不了解。美国的Windows 7说我距离UTC还有5个小时;其他一切(包括Windows 2008设置为UTC时间)说4个小时。

那么,例程应该如何生成具有尾随时区偏移的ISO样式时间戳? Windows API告诉我它应该是-0500,但其他一切都说应该是-0400。救命!!


在东部夏令时期间,偏移确实是UTC-04:00。 Windows中时区的显示名称列表不会更改以反映此情况。它只显示标准偏移量,东部标准时间为UTC-05:00。

您是正确的,服务器应设置为"(UTC)协调世界时",而不是标记为"(UTC)都柏林,爱丁堡,里斯本,伦敦"的设置。"协调世界时"设置永久固定为UTC,其中另一个在英国夏令时具有UTC + 01:00的日光偏移。同样,标签仅显示标准偏移,即UTC + 00:00,在显示中缩短为"(UTC)"。

您提出的唯一编程问题:

So what should a routine do to produce an ISO-style timestamp with a trailing timezone offset?

这在很大程度上取决于您使用的语言。您提到了用于获取系统当前时区信息的Win32 API,但很少直接调用它们。你在用C写作吗? C ++? C#? VB? Java的?还有什么?请回答,我可以回答这个问题。