转换已弃用的时区 php

Convert deprecated timezones php

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

但问题是,对于其中一些,只有已弃用 php 列表中的 IANA 名称 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"

他们的正确选择是什么?

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

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

另一个选项:

  1. 使用 https://wikitable2csv.ggor.de/ you could get csv file from this table: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones。 我认为这个数据不会很快改变,所以你可以下载一次并保存在你的项目中。

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

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

  4. 从重复项中过滤结果

这样,我想你不会有空值

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

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

  • 其中大部分是 IANA 数据库中的 Link 条目,指向当前规范的 Zone 条目。例如,Asia/Calcutta 是指向 Asia/Kolkata 的 link。两者均有效,可用于 PHP 和其他系统。

  • 除了极少数例外,IANA 区域名称从未真正“弃用”,它们只是降级为 link 并变为 non-canonical。当我将该列添加到 the Wikipedia table 时,我应该选择更好的措辞。 (是的,就是我。也许我可以更新它。)

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

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

  • Etc/UTC 是规范的 UTC 时区。在大多数情况下,在服务器上设置默认时区时应该继续使用它。它没有以任何方式弃用。

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

考虑到所有这些 - 您可以直接使用 CLDR Windows 区域映射文件的结果。除非您要提供规范的结果,否则您不需要将 link 进行任何额外的区域转换。

此外 - 您可能不需要自己编写此代码。 PHP 的 Internationalization Package can be installed by adding extension=php_intl.dll to your php.ini file. Then you can use functions like IntlTimeZone::getIDForWindowsID 执行映射。它在后台使用相同的 CLDR 文件。