【问题标题】:ASP.NET 3.5: Difficulty getting timezone's current offsetASP.NET 3.5:难以获得时区的当前偏移量
【发布时间】: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 匹配。
  • 我意识到这太晚了,但我只是想同情一下。我搬到了墨尔本,在那里我必须开发一个与布里斯班通信的应用程序(显然对时间高度敏感)——虽然在同一时区,但不遵守夏令时......该死的澳大利亚人!

标签: .net timezone


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 2015-01-03
    • 1970-01-01
    • 2019-03-14
    • 2020-08-17
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多