一尘不染

如何在Windows和IANA时区之间转换?

c#

时区标签wiki所述,时区有两种不同的样式。

  • Microsoft提供的与Windows和.Net TimeZoneInfo类一起使用的(在Windows上运行时)由诸如的值标识"Eastern Standard Time"

  • IANDB在TZDB中提供的那些,TimeZoneInfo在Linux或OSX上运行时由.NET 类使用,由诸如的值标识"America/New_York"

许多基于Internet的API使用IANA时区,但由于多种原因,可能需要将其转换为Windows时区ID,反之亦然。

如何在.Net中完成?


阅读 602

收藏
2020-05-19

共1个答案

一尘不染

Windows和IANA时区标识符之间进行转换的数据的主要来源是windowsZones.xml作为Unicode
CLDR
项目的一部分分发的文件。

但是
,CLDR每年仅发布两次。这与Windows更新的定期节奏以及IANA时区数据库的不定期更新一起,使得直接使用CLDR数据变得很复杂。请记住,时区更改本身是由世界各国政府一时兴起的,并非所有更改都在引起足够注意的情况下进行以使其在各自的生效日期之前进入这些发布周期。

还有一些其他需要处理的极端情况,CLDR并未严格涵盖这些情况,并且不时弹出新的情况。因此,我将解决方案的复杂性封装到TimeZoneConverter微库中,可以从Nuget安装该库。

使用这个库很简单。以下是一些转换示例:

string tz = TZConvert.IanaToWindows("America/New_York");
// Result:  "Eastern Standard Time"

string tz = TZConvert.WindowsToIana("Eastern Standard Time");
// result:  "America/New_York"

string tz = TZConvert.WindowsToIana("Eastern Standard Time", "CA");
// result:  "America/Toronto"

项目站点上还有更多示例。

重要的是要认识到,虽然IANA时区可以映射到单个Windows时区,但事实并非如此。一个Windows时区可能映射到多个IANA时区。在上面的示例中可以看到这一点,其中Eastern Standard Time既映射到,也映射America/New_YorkAmerica/Toronto。TimeZoneConverter将提供带有CLDR标记的区域"001",称为“黄金区”,除非您专门提供了国家(地区)代码,并且该国家/地区的其他区域存在匹配项。

注意:多年来,答案一直在发展,因此以下评论可能适用于当前修订版,也可能不适用于当前修订版。 查看编辑历史记录以了解详细信息。谢谢。

2020-05-19