使用Noda Time的Olson时区ID到Windows标准格式

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

虽然谷歌代码页面声明有一个function可以在两者之间进行转换,但我找不到有关如何执行此操作的详细信息。

谁能指出我正确的方向?

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

现在所有的“提供者”界面都略有提升:

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

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

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谷歌小组。

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