【问题标题】:Convert .Net TimeZoneInfo to POSIX time zone将 .Net TimeZoneInfo 转换为 POSIX 时区
【发布时间】:2018-12-20 14:05:34
【问题描述】:

我需要将 .Net 中的时区转换为 POSIX timezone。我可以从TimeZoneInfo 通过GetAdjustmentRules 获得夏令时开始、结束和增量,但是我仍然会丢失时区缩写代码(例如 MST/MDT、PST/PDT 等)。在 C# .Net 中执行此操作。

基本上,我正在寻找的是与此相反的内容:Convert a posix style timezone to timezoneinfo in c# .net

是否有针对此类问题的现有解决方案?或者有谁知道我在哪里可以获得标准和夏令时缩写代码?

【问题讨论】:

  • 为什么要这样做?这种格式在 AIX 之外很少使用,并且存在很多问题 - 如果规则发生变化会发生什么,就像俄罗斯每隔几年就会发生的那样? IANA/Olson 时区(该链接称为 Olson)是所有系统的事实上的标准,从智能手机到航空公司的大型机。在 .NET 中,您可以使用 NodaTime 处理 IANA 时区。如果您需要与 AIX 通信,您可能应该使用 Olson
  • @PanagiotisKanavos 使用一系列设备,这些设备似乎已经从其 Linux 发行版中清除了标准时区库,而是选择了 POSIX 标准。我会试试 NodaTime。谢谢!
  • 我不寒而栗地想到规则改变时会发生什么。在任何情况下,您都可以使用已编译的 tzdata 数据库附带的 NodaTime,但我怀疑您希望能够解析 TZ 环境变量。在任何情况下,您不应该依赖 TimeZoneInfo。是时候 ping 我认为的 NodaTime 作者了
  • 看起来有一个 NodaTime Issue 关于 Linux 上的 TimeZoneInfo 故障以及他们如何为库修复它

标签: c# .net timezone posix


【解决方案1】:

我刚刚添加了对 POSIX 时区字符串的支持,作为我的 TimeZoneConverter 项目的附加组件。它位于一个名为TimeZoneConverter.Posix 的单独包中。安装它,您可以执行以下操作:

string posix = PosixTimeZone.FromTimeZoneInfo(SomeTimeZoneInfoObject);

此外,您可以简单地提供 Windows 时区 ID 或 IANA 时区名称,这也可以:

string posix = PosixTimeZone.FromWindowsTimeZoneId("Eastern Standard Time");
// Result: "EST5EDT,M3.2.0,M11.1.0"

string posix = PosixTimeZone.FromIanaTimeZoneName("Australia/Sydney");
// Result: "AEST-10AEDT,M10.1.0,M4.1.0/3"

请记住,您仍然受到 POSIX 时区的限制:

  • 他们每年只能支持两次转换。
  • 并非所有时区转换都适用于 DST。有些是标准时间的变化,这里没有反映出来。它们看起来像 DST 转换。
  • 他们自己不提供任何历史变化。

最后一点,上面显示的示例使用 当前 年份,但也有提供年份来生成特定于该年份的字符串的重载。

【讨论】:

  • @jairhumberto - 确实如此。我得到"<-03>3" 这是正确的。 "-03" 是可用的 IANA 缩写。 <> 字符是 POSIX 规范在缩写部分中转义数字的方法。 3 是全年有效的 UTC-3 偏移量的 POSIX 表示。它可能看起来很难看,但它应该是这样工作的。如果您想进一步讨论,请open an issue in the repo。谢谢。
猜你喜欢
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多