2

I need to convert a time zone from olson time zone in windows. Using PHP.

I found this http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml

It seems that it is not difficult to convert using this data.

But there are questions:

1) Can I trust this source?

2) How parse type with multi values:

<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"/>

Divided by space character?

  • America/New_York
  • America/Detroit
  • America/Indiana/Petersburg
  • America/Indiana/Vincennes
  • America/Indiana/Winamac
  • America/Kentucky/Monticello
  • America/Louisville

But why some zones have three components?

3) Always there when converting Olson time zone => Windows time zone will receive only 1 timezone or maybe more? And what to do in this case?

4) Are there any pitfalls? For example UTC.

4

1 回答 1

1

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

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

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

为什么某些区域具有三个组件与 CLDR 无关,但这些实际上是原始区域标识符。 维基百科有很好的解释

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

是的,还有更多的陷阱:

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

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

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

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

于 2014-12-15T22:09:30.360 回答