我需要在窗口中将时区从奥尔森时区转换。使用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"/>
按空格字符划分?
- 美洲/New_York
- 美洲/底特律
- 美洲/印第安纳州/彼得堡
- 美洲/印第安纳州/文森斯
- 美洲/印第安纳州/维纳马克
- 美洲/肯塔基州/蒙蒂塞洛
- 美洲/路易斯维尔
但是为什么有些区域有三个组成部分呢?
3(转换奥尔森时区时总是在那里=>Windows时区将只接收1个时区或更多?在这种情况下该怎么办?
4(有什么陷阱吗?例如 UTC。
是的,您可以信任该来源,它确实是用于此类转换的最佳来源。 我使用相同的数据来实现 .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。 这使得从奥尔森映射到Windows有点困难,因为您必须检查所有链接。
例如,印度在CLDR中
Asia/Calcutta
。 它已在 IANA tzdb 中更新为Asia/Kolkata
- 将Asia/Calcutta
替换为链接。 要将Asia/Kolkata
映射到Windows"印度标准时间",您必须根据映射检查区域的所有链接。CLDR将Windows"UTC"区域映射到"Etc/GMT"。 IANA 将
Etc/UTC
(和其他缩写(视为一个单独的区域,而不是一个链接。 因此,您必须手动处理这些。