Windows GetTimeZoneInformation时间差不为';与ISO网站或谷歌不匹配

Windows GetTimeZoneInformation时间差不为';与ISO网站或谷歌不匹配,windows,timezone,timezone-offset,Windows,Timezone,Timezone Offset,我的电脑是Windows7 64位;我在美国东海岸(东部时间);“日期和时间”小程序——通过右键单击任务栏时钟并选择“调整日期/时间”来实现——标记我的时区(UTC-05:00)东部时间(美国和加拿大)”并告诉我夏令时将在11月结束。(对于后来出现的人来说,这是在4月份写的,当时我们在夏令时推出了“春游”计划。) 调用Windows GetTimeZoneInformation或GetDynamicTimeZoneInformation API(后者仅在Vista或更高版本上可用)将返回300分

我的电脑是Windows7 64位;我在美国东海岸(东部时间);“日期和时间”小程序——通过右键单击任务栏时钟并选择“调整日期/时间”来实现——标记我的时区(UTC-05:00)东部时间(美国和加拿大)”并告诉我夏令时将在11月结束。(对于后来出现的人来说,这是在4月份写的,当时我们在夏令时推出了“春游”计划。)

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

但是,如果我去,它会显示一个与时钟匹配的时间,但结束时间为-0400。(我试图复制/粘贴它,但很难,因为它每秒钟都在变化。)在谷歌中键入“当前utc时间”显示的时间也比这里的时钟时间提前4(而不是5)小时

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

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

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

除了认为EC2实例的时区设置错误之外——为了实现上述目标,它应该设置为UTC而不是伦敦时间——我对这一点没有进一步的理解。美国的Windows7说我离UTC有5小时的路程;其他所有内容(包括设置为UTC时间的Windows 2008)都显示为4小时


那么,一个例程应该做什么来生成一个带有尾随时区偏移的ISO样式的时间戳呢?Windows API告诉我它应该是-0500,但其他所有东西都说它应该是-0400。救命

在东部夏时制期间,偏移量实际上是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?JAVA还有别的吗?请回答,我可以回答这个问题。

偏移量取决于测量它的时间(DST是否处于活动状态)。这就是你的问题。所以返回偏差值的API,以及DST是否处于活动状态(在API返回代码中),没有调整偏差以允许我单独使用它?我必须使用偏差和“我们是否在DST中?”数据才能得出正确的答案?您使用的是什么datetime API?应该有一个函数获取时间戳并返回其偏移量。请注意,某些时区的DST偏移量不超过一小时。我强烈建议您阅读并