0

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

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

但是,如果我访问声称向我显示计算机时间的 ISO 网站,它会显示与时钟匹配但以 -0400 结尾的时间。(我试图复制/粘贴它,但很难,因为它每秒都在变化。)在谷歌中输入“当前时间 utc”显示的时间也比时钟时间提前 4 小时(不是 5 小时)。

更让我感到困惑的是——我有一个运行 Windows Server 2008 的 EC2 实例,其他人设置并说它故意设置为 GMT,这样基于服务器时钟记录的时间不会因夏令时导致 1 小时跳跃.

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

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

除了认为 EC2 实例的时区设置错误——它应该被设置为 UTC 而不是伦敦时间来实现上述目标——我没有进一步理解这一点。美国的 Windows 7 说我距离 UTC 5 小时;其他一切(包括设置为 UTC 时间的 Windows 2008)都说 4 小时。

那么例程应该怎么做才能产生一个带有尾随时区偏移量的 ISO 风格的时间戳呢?Windows API 告诉我它应该是-0500,但其他一切都说它应该是-0400。帮助!!

4

1 回答 1

1

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

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

您问的唯一编程问题:

那么例程应该怎么做才能产生一个带有尾随时区偏移量的 ISO 风格的时间戳呢?

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

于 2013-04-19T00:19:23.327 回答