我不确定这里我做错了什么。我尝试获取澳大利亚东部当前UTC时区偏移量的小时数。我使用的代码返回GMT+10小时,而实际上应该是11小时,因为他们目前处于夏令时。
这是我用来获取它的代码:
With TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time")
Console.Write(.GetUtcOffset(Now.ToUniversalTime).Hours)
End With
似乎输出了“基本”偏移量,而忽略了夏令时。如何获取考虑夏令时的实际当前偏移量?
更新1:根据jlew的建议,我尝试使用IsDaylightSavingTime,但这似乎给出了不一致的结果。我知道澳大利亚东部和新西兰目前都处于夏令时。
然而,以下语句返回FALSE(不正确):
TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time").IsDaylightSavingTime(Now.ToUniversalTime)
以下内容返回TRUE(正确):
TimeZoneInfo.FindSystemTimeZoneById("New Zealand Standard Time").IsDaylightSavingTime(Now.ToUniversalTime)
更新2 在看到这篇文章后,我检查了IsAmbiguousTime,但两种情况下它都是False。所以它不是“模糊的”,但“E. Australia”区在应该使用夏令时时没有使用。
更新3 在看到这篇文章后,我安装了来自MS的2011年12月累积DST更新,但没有成功。东澳大利亚地区仍然不正确。
我还尝试在另外两个不同的服务器上运行代码,结果相同。我的是.net v3.5,其他的是v4。
更新4 好吧,可能已经解决了。再次查看系统时区ID列表时,我注意到东澳大利亚有一个名为“AUS Eastern Standard Time”的另一个区域名称。使用该区域,它会产生正确的、支持夏令时的结果。使用“E. Australia Standard Time”则不行。
搜索一下,似乎有一种变态的理解,因为同一国家的同一时区的不同城市可能有不同的夏令时规则。是谁让他们这样做的?
没有一个全球地图显示哪些区域ID与哪些城市相关,这是一个问题。肯定对于微软来说,这不是太难提供的服务。可以使用DisplayName属性显示用户可以选择的列表,但如果应用程序需要将时间从一个城市转换为另一个城市,它需要知道这些城市应该使用哪些ID。
如果微软包括一个城市到区域ID的查找,至少对于主要城市,那么使用时区将会更加轻松。