【问题标题】:Olson time zone to windows奥尔森时区到windows
【发布时间】:2015-02-12 11:45:23
【问题描述】:

我需要从 Windows 中的 olson 时区转换时区。 使用 PHP。

我找到了这个http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml

使用这些数据,似乎不难转换。

但有问题:

1) 我可以相信这个来源吗?

2) 如何解析多值类型:

<mapZone other="Eastern Standard Time" territory="US" type="America/New_York America/Detroit America/Indiana/Petersburg America/Indiana/Vincennes America/Indiana/Winamac America/Kentucky/Monticello America/Louisville"/>

按空格字符划分?

  • 美国/纽约
  • 美国/底特律
  • 美国/印第安纳州/彼得堡
  • 美国/印第安纳/文森斯
  • 美国/印第安纳州/Winamac
  • 美国/肯塔基州/蒙蒂塞洛
  • 美国/路易斯维尔

但为什么有些区域包含三个组件?

3) 转换 Olson 时区时始终存在 => Windows 时区将只接收 1 个时区或更多?在这种情况下该怎么办?

4) 有什么陷阱吗?例如 UTC。

【问题讨论】:

    标签: php unicode timezone iana


    【解决方案1】:

    是的,您可以信任该来源,它确实是用于此类转换的最佳来源。我已经使用相同的数据来实现the conversion functions for .NET

    由于您的问题是关于 PHP,我认为这不是一个重复的问题 - 尽管我很好奇您为什么要在 PHP 中执行此操作,因为 PHP 使用 IANA/Olson 时区,即使在 Windows 上也是如此。

    Windows 时区往往比 IANA 时区更宽,因此解释了为什么映射中存在多个值。该列表确实由空格分隔,并且 CLDR 规范要求列表中的 first 条目是 CLDR 的规范引用。

    为什么某些区域具有三个组件与 CLDR 无关,但这些实际上是原始区域标识符。 Wikipedia has a good explanation.

    从 Olson 到 Windows 只有一个标识符 - 但不一定从 Windows 到 Olson。

    是的,还有更多的陷阱:

    • 并非所有 IANA/Olson 区域都可以映射到 Windows 区域 ID。示例:America/Atikokan

    • CLDR 和 IANA 在什么是规范方面存在分歧。 CLDR 规范 id 永远不会更改,而 IANA 规范 id 确实可以更改,用链接替换以前的 id。这使得从 Olson 映射到 Windows 有点困难,因为您必须检查所有链接。

      例如,印度在 CLDR 中是 Asia/Calcutta。它已在 IANA tzdb 中更新为 Asia/Kolkata - 用链接替换 ​​Asia/Calcutta。要将 Asia/Kolkata 映射到 Windows“印度标准时间”,您必须对照映射检查该区域的所有链接。

    • CLDR 将 Windows“UTC”区域映射到“Etc/GMT”。 IANA 将Etc/UTC(和其他缩写)视为一个单独的区域 - 而不是一个链接。所以,你必须手动处理这些。

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 2014-08-26
      • 2012-08-24
      • 2012-02-15
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多