【发布时间】:2012-01-11 12:20:24
【问题描述】:
不知道我在这里做错了什么。我正在尝试获取澳大利亚东部当前的 # 小时 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 但这似乎给出了不一致的结果。我知道东澳大利亚和新西兰目前都在夏令时。
但是,以下返回 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 时却没有使用。
Update 3 看到this post 后,我从MS 安装了Dec 2011 cumulative DST update,但没有任何乐趣。 E. Australia 区域仍然不正确。
我还尝试在其他 2 台不同的服务器上运行代码,结果相同。我的是.net v3.5,其他的是v4。
更新 4 好的,可能已经解决了。再次查看系统时区 ID 列表,我注意到 East Aus 的 另一个 时区名称。它被称为“澳大利亚东部标准时间”。使用该区域,它确实会产生正确的、对 DST 友好的结果。使用“E. Australia Standard Time”则不然。
四处搜索,似乎有一种变态的感觉,因为同一国家同一时区的不同城市可能有不同的夏令时规则。谁让他们这么做的??
没有哪个区域 ID 与哪些城市相关的全球地图是个问题。当然,这对 MS 来说并不太难。可以使用 DisplayName 属性显示用户可以从中选择的列表,但如果应用程序需要将时间从一个城市转换到另一个城市,它需要以某种方式知道这些城市应该使用哪些 ID。
如果 MS 包括对 City-to-ZoneID 的查找,至少对于主要城市来说,处理时区会很麻烦。
【问题讨论】:
-
你有这样一个列表,点击任务栏中的时钟并导航到时区选择器。请注意布里斯班市的特别之处。它位于非洲大陆的最东部边缘,自 1992 年以来就没有实行夏令时。
-
我的意思是我们需要 .NET 中的列表,以便我们可以自动将城市名称与区域 ID 匹配。
-
我意识到这太晚了,但我只是想同情一下。我搬到了墨尔本,在那里我必须开发一个与布里斯班通信的应用程序(显然对时间高度敏感)——虽然在同一时区,但不遵守夏令时......该死的澳大利亚人!