奥尔森时区到窗口

时间:2014-12-14 03:40:15

标签: php unicode timezone iana

我需要在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"/>

除以空格字符?

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

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

3)转换奥尔森时区时总是在那里=&gt; Windows时区只会收到1个时区或更多?在这种情况下该怎么做?

4)有任何陷阱吗?例如UTC。

1 个答案:

答案 0 :(得分: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&#34;印度标准时间&#34;,您必须根据映射检查区域的所有链接。

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