我需要在 Windows 中从奥尔森时区转换时区。
使用PHP。
我找到了这个http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml 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) 转换 Olson 时区时始终存在 => Windows 时区将仅接收 1 个或更多时区?在这种情况下该怎么办?
4)有什么陷阱吗?例如UTC。
是的,您可以信任该来源,它确实是用于此类转换的最佳来源。我使用相同的数据来实现.NET 的转换函数 https://stackoverflow.com/a/17348822/634824.
由于您的问题是关于 PHP 的,所以我认为这不是一个重复的问题 - 尽管我很好奇为什么您想在 PHP 中执行此操作,因为 PHP 使用 IANA/Olson 时区,即使在 Windows 上也是如此。
Windows 时区往往比 IANA 区域更宽,因此解释了映射中存在多个值的原因。该列表确实是用空格分隔的,并且 CLDR 规范要求first列表中的条目是 CLDR 的规范参考。
为什么有些区域具有三个组件与 CLDR 无关,但这些实际上是原始区域标识符。维基百科有很好的解释 http://en.wikipedia.org/wiki/Tz_database#Names_of_time_zones.
从 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
(和其他缩写)作为单独的区域 - 而不是链接。因此,您必须手动处理这些。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)