Olson时区Id使用Noda时间转换为Windows标准格式

本文关键字:Windows 标准 格式 转换 时间 时区 Id 使用 Noda Olson | 更新日期: 2023-09-27 18:21:05

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

虽然谷歌代码页面上说有一个函数可以在两者之间转换,但我在任何地方都找不到如何做到这一点的详细信息。

有人能给我指正确的方向吗?

Olson时区Id使用Noda时间转换为Windows标准格式

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

所有的"提供商"接口现在都有点悬而未决:

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

换句话说:很抱歉,我们目前不支持这一点,但当我们试图最终确定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映射到Windowstz的方法(通过windowsIdMap值进行简单迭代)。