使用Noda Time将Olson时区ID转换为Windows标准格式

4
在SO上多次出现了Olson与Windows时间ID之间的转换问题;许多人建议使用Jon Skeet的Noda Time来解决此问题。
虽然Google Code页面显示有用于两者之间进行转换的函数,但我无法找到如何执行此操作的详细信息。
请问有没有人能指导我一下?

代码中没有看到这个。你可以从Olson ids或Windows TimeZoneInfo对象创建DateTimeZone对象,但是我认为不能进行转换。 - Ian Mercer
1
现在可以使用Noda Time 1.1.0来完成此操作。我已经在这里发布了转换函数。 - Matt Johnson-Pint
2个回答

1
很抱歉,目前我们没有Windows到Olson的映射。
“提供者”接口现在有些不确定:
- 即使在当前代码中,我们也想要进行API更改,部分原因是为了使使用它的代码更易于测试。 - Unicode CLDR映射在1.x和2.x之间发生了变化,因此现在可能会有多个映射(如果我没记错的话)。
换句话说:很抱歉,我们目前不支持此功能,但在尝试最终确定1.0 API时,我们会考虑这一点。

0

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 时区映射的方法(简单迭代通过 windowsIdMap 值)。


实现很好 - MapTimeZoneId 的目的是将 Windows 到提供程序特定 ID 进行映射。这就是为什么它需要一个 TimeZoneInfo 而不是一个字符串。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接