小编典典

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

all

如时区标签 wiki中所述,有两种不同风格的时区。

  • Microsoft 提供的用于 Windows 和 .NetTimeZoneInfo类(在 Windows 上运行时)的那些由诸如"Eastern Standard Time".

  • 在 TZDB 中由 IANA 提供并由 .NETTimeZoneInfo类在 Linux 或 OSX 上运行时使用的那些由诸如"America/New_York".

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

这如何在 .Net 中实现?


阅读 69

收藏
2022-07-27

共1个答案

小编典典

当前状态:

从 .NET 6 开始,任何同时安装了时区数据和 ICU 的平台都支持这两种形式的时区,这是大多数 Windows、Linux 和 MacOS
的安装。

原答案:

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",称为“黄金区域”,除非您特别提供国家代码并且该国家/地区的不同区域存在匹配项。

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

2022-07-27