【问题标题】:Olson Time Zone Id to Windows Standard Format using Noda Time使用 Noda 时间将奥尔森时区 ID 转换为 Windows 标准格式
【发布时间】:2012-02-15 18:42:03
【问题描述】:

在 SO 上多次出现 Olson 和 Windows 时间 ID 之间的转换;许多人建议 Jon Skeet 的 Noda Time 完成这项任务。

虽然 Google 代码页面声明有一个函数可以在两者之间进行转换,但我在任何地方都找不到如何执行此操作的详细信息。

谁能指出我正确的方向?

【问题讨论】:

  • 在代码中没见过。您可以从 Olson id 或 Windows TimeZoneInfo 对象创建 DateTimeZone 对象,但无法转换 AFAIK。
  • 现在可以使用 Noda Time 1.1.0 完成。 I have posted conversion functions here.

标签: c# asp.net time timezone


【解决方案1】:

不,很遗憾,我们目前没有这种方式的映射(Windows 到 Olson)。

所有的“提供者”界面现在都还悬而未决:

  • 即使在当前代码中,我们也希望对 API 进行一些更改,部分原因是为了使使用它的代码更具可测试性
  • Unicode CLDR 映射在 1.x 和 2.x 之间发生了变化,因此现在每种方式都有多个映射,可能 (IIRC)。

换句话说:抱歉,我们目前不支持此功能,但我们会在尝试最终确定 1.0 API 时牢记这一点。

【讨论】:

    【解决方案2】:

    TzdbTimeZoneProvider 支持从 Windows 到 Olson 的转换,但是 BclTimeZoneProvider(windows 时区的提供者)没有正确实现 MapTimeZoneId 方法和接口似乎错误...

    这是TzdbTimeZoneProvider的实现:

     public string MapTimeZoneId(TimeZoneInfo zone)
     {
       string str;
       this.windowsIdMap.TryGetValue(zone.Id, out str); 
       return str;
     }
    

    注意:windowsIdMap 是一个字典

    这是BclTimeZoneProvider的实现:

    public string MapTimeZoneId(TimeZoneInfo timeZone)
    {
      return timeZone.Id;
    }
    

    注意:它只返回 windows 时区的 id。

    这个方法的更正确的界面似乎是:

     string MapTimeZoneId(string providerZoneId);
    

    那么这两种实现都可以正确完成。我想你可以把这个问题放在 Noda Time google groups 上。

    现在您可以查看TzdbTimeZoneProvider 以找到如何从 Olson 映射到 Windows tz 的方法(通过 windowsIdMap 值进行简单迭代)。

    【讨论】:

    • 实现很好 - MapTimeZoneId 的目的是将 Windows 映射到 提供程序特定的 ID。这就是为什么它需要 TimeZoneInfo 而不是字符串。
    • @JonSkeet:谢谢你的澄清,我现在明白了。
    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2013-10-15
    • 2012-10-23
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多