gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:33:00 24 4
gpt4 key购买 nike

the timezone tag wiki 中所述, 有两种不同风格的时区。

  • Microsoft 提供的用于 Windows 和 .Net TimeZoneInfo 类(在 Windows 上运行时)的那些由诸如 “东部标准时间” .

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

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

这在 .Net 中如何实现?

最佳答案

现状:

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

原答案:

Windows 和 IANA 时区标识符之间转换数据的主要来源是 windowsZones.xml 文件,作为 the Unicode CLDR 的一部分分发。项目。可以找到最新的开发版本 here .

但是,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"

还有更多例子on the project site .

重要的是要认识到,虽然 IANA 时区可以映射到单个 Windows 时区,但反之则不然。一个 Windows 时区可能映射到多个 IANA 时区。这可以在上面的示例中看到,其中 Eastern Standard Time 被映射到 America/New_YorkAmerica/Toronto。 TimeZoneConverter 将提供 CLDR 用 “001” 标记的区域,称为“黄金区域”,除非您专门提供国家代码并且该国家/地区的不同区域存在匹配项。

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

关于c# - 如何在 Windows 和 IANA 时区之间进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17348807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com