- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如 the timezone tag wiki 中所述,有两种不同风格的时区。
由 Microsoft 提供的用于 Windows 和 .Net 的 TimeZoneInfo
类(在 Windows 上运行时)由诸如 "Eastern Standard Time"
之类的值标识。 .
由 IANA 在 TZDB 中提供并由 .NET TimeZoneInfo
使用的内容在 Linux 或 OSX 上运行时,类由诸如 "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 时区。这可以在上面的示例中看到,其中东部标准时间
映射到America/New_York
和America/Toronto
。 TimeZoneConverter 将提供 CLDR 标记为“001”的区域(称为“黄金区域”),除非您专门提供国家/地区代码并且该国家/地区的其他区域有匹配项。
注意:这个答案多年来一直在演变,因此下面的评论可能适用也可能不适用于当前的修订版。查看编辑历史记录以了解详细信息。谢谢。
关于c# - 如何在 Windows 时区和 IANA 时区之间进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44145727/
我是一名优秀的程序员,十分优秀!