ASP.NET 3.5:难以获得时区的当前偏移量

时间:2011-12-02 13:16:06

标签: .net timezone

不确定我在这里做错了什么。我正试图获得东澳大利亚当前的#小时UTC偏移量。我正在使用的代码是GMT + 10小时,而它应该是11,因为他们现在在DST。

我正在使用它来获取它:

With TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time")
  Console.Write(.GetUtcOffset(Now.ToUniversalTime).Hours)
End With

似乎输出“基数”偏移,无视DST。如何获得将DST考虑在内的实际当前偏移量?

更新1 以回应jlew的建议。我已经尝试过获取IsDaylightSavingTime,但这似乎给出了一个不一致的结果。我知道东澳大利亚和新西兰目前都在DST。

但是,以下内容返回FALSE(不正确):

TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time").IsDaylightSavingTime(Now.ToUniversalTime)

以下返回TRUE(正确):

TimeZoneInfo.FindSystemTimeZoneById("New Zealand Standard Time").IsDaylightSavingTime(Now.ToUniversalTime)

更新2 看到this post后,我检查了IsAmbiguousTime,但在两种情况下都是False。所以它不是“含糊不清”,但“E. Australia”区域应该没有使用DST。

更新3 看到this post后,我从MS安装了Dec 2011 cumulative DST update,但没有任何乐趣。 E. Australia区域仍然不正确。

我还尝试在其他2台服务器上运行代码,结果相同。我的是.net v3.5,其他的是v4。

更新4 好的,可能已经解决了。再次查看系统时区ID列表,我注意到了东方Aus的另一个区域名称。它被称为“AUS东部标准时间”。使用该区域,它确实产生正确的,DST友好的结果。使用“E. Australia Standard Time”不会。

搜索周围,它似乎是一种变态的感觉,因为在同一个国家的同一时区,不同的城市可能有不同的DST规则。谁让他们这样做?

这是一个问题,没有全局地图,哪个区域ID与哪些城市相关。当然,MS并不难提供。可以使用DisplayName属性显示用户可以选择的列表,但如果应用程序需要将时间从一个城市转换为另一个城市,则需要知道这些城市应该使用哪些ID。

如果MS包含了City-to-ZoneID的查询,至少对于主要城市来说,使用时区需要花费很多麻烦。

1 个答案:

答案 0 :(得分:0)

我不知道是否有自动方式,但您可以使用TimeZone.IsDaylightSavingsTimeDaylightTime.Delta来计算必要的调整。