首页 文章

奥尔森时区到窗口

提问于
浏览
2

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

除以空间特征?

  • America / New_York

  • 美国/底特律

  • 美国/印第安纳州/彼得堡

  • America / Indiana / Vincennes

  • America / Indiana / Winamac

  • 美国/肯塔基州/蒙蒂塞洛

  • America / Louisville

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

3)转换Olson时区时总是在那里=> Windows时区只会收到1个时区或者更多吗?在这种情况下该怎么办?

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

1 回答

  • 1

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

    你为什么要做到这一点在PHP虽然我很好奇,因为PHP使用IANA /奥尔森时区,甚至在Windows上 - 因为你的问题是问关于PHP,我会考虑这不是一个重复的问题 .

    Windows时区往往比IANA区域更广泛,因此解释了为什么映射中存在多个值 . 该列表确实是用空格分隔,且CLDR规范规定,在列表中的第一项是为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 "India Standard Time",你必须检查针对映射区域中的所有链接 .

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

相关问题