【问题标题】:Convert deprecated timezones php转换不推荐使用的时区 php
【发布时间】:2021-02-06 12:41:05
【问题描述】:

我正在将 Windows 时区映射到 IANA,请使用此来源 https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/windowsZones.xml

但问题在于,对于其中一些人来说,只有 IANA 名称来自已弃用的 php 列表 https://www.php.net/timezones.others

"Dateline Standard Time" "Etc/GMT+12"

 "Greenland Standard Time" "America/Godthab"

"India Standard Time" "Asia/Calcutta"

 "Nepal Standard Time" "Asia/Katmandu"

什么是他们的正确选择?

【问题讨论】:

    标签: php windows timezone iana


    【解决方案1】:

    PHP "other time zones" page 顶部的警告对于用户或开发人员为其应用程序选择特定时区是合理的。但是,这些警告缺乏上下文。具体来说:

    • 该页面上列出的所有时区仍然是有效的 IANA 时区标识符。他们现在工作,他们将在未来继续工作。

    • 其中大部分是 IANA 数据库中的 Link 条目,它们指向当前规范的 Zone 条目。例如,Asia/Calcutta 是指向Asia/Kolkata 的链接。两者都有效,可以在 PHP 和其他系统中使用。

    • 除了极少数例外,IANA 区域名称实际上从未被“弃用”,它们只是降级为链接并变得不规范。当我将该专栏添加到the Wikipedia table 时,我应该选择更好的措辞。 (是的,就是我。也许我可以更新它。)

      • Canada/East-Saskatchewan 是一个罕见的例外,由于其字符串长度长且很少使用,它在 IANA 2017c 中被完全删除。如果您的数据库中有此内容,请将其替换为 America/Regina

      • 另一个罕见的例外是 US/Pacific-New,在 IANA 2020b 中完全删除,因为它造成了很多混乱。它从来都不是一个真正的时区,而只是一个链接。如果您的数据库中有此内容,请将其替换为 America/Los_Angeles

    • Etc/UTC 是标准 UTC 时区。在大多数情况下,在服务器上设置默认时区时应该继续使用它。它不会以任何方式被弃用。

    • Etc/GMT+Etc/GMT- 开头的区域是非领土水域海上船舶的固定偏移规范区域。它们有时也用于其他边缘情况。它们不会以任何方式被弃用。它们的偏移量是有意反转的 (Etc/GMT+12 = UTC-12)。

    考虑到所有这些 - 您可以直接使用 CLDR Windows 区域映射文件的结果。除非您尝试提供规范的结果,否则您无需对指向区域的链接进行任何额外的翻译。

    此外,您可能不需要自己编写此代码。 PHP 的Internationalization Package 可以通过将extension=php_intl.dll 添加到您的php.ini 文件中来安装。然后您可以使用IntlTimeZone::getIDForWindowsID 之类的函数来执行映射。它在后台使用相同的 CLDR 文件。

    【讨论】:

    • 感谢提示,现在我不需要直接解析 xml。但我还需要 Windows 显示名称,现在我解析我使用TZUTIL /L 获得的文件。你知道任何 php 内置插件或包吗?
    • @ogbofjnr - 不在 PHP 中,但您可以使用来自 TimeZoneWindowsResourceExtractor 的输出文件。 repo 中的tzinfo.json 文件有最近的结果。尽管如果您只需要操作系统当前的语言(TZUtil /L 很好),这可能有点过头了,或者您可以从 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones 的注册表中收集它们
    【解决方案2】:

    您可以尝试从此文件中解析和映射它们:

    https://github.com/eggert/tz/blob/2017b/backward

    【讨论】:

    • 都在那里,除了Etc/GMT+12 你知道怎么处理它吗?
    • @ogbofjnr 试试这个方法:stackoverflow.com/a/64501364/7265862
    • 不确定为什么要使用该文件的 2017b 版本。已经很老了。
    【解决方案3】:

    另一种选择:

    1. 使用https://wikitable2csv.ggor.de/,您可以从此表中获取 csv 文件:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones。 我认为这些数据不会很快更改,因此您可以下载一次并保存在您的项目中。

    2. 如果您查看status 列,您会发现可能存在CanonicalAlias 值。

    3. 如果此列是别名,您应该从Notes 列中获取规范时区的名称。 如果列是规范的 - 就是这样

    4. 从重复项中过滤结果

    这样,我认为你不会有空值

    【讨论】:

    • 维基百科列表已经过时了。它是从 2017c 开始的。当前的 IANA 版本是 2020d。 IANA 数据是来源,通常每年会更改多次。维基百科不具有权威性。我在更新该页面时一直松懈;我可能应该。
    猜你喜欢
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多