1

我正在将 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"

什么是他们的正确选择?

4

3 回答 3

3

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

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

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

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

    • 一个罕见的例外是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 的国际化包可以通过添加extension=php_intl.dll到您的php.ini文件中来安装。然后,您可以使用诸如IntlTimeZone::getIDForWindowsID执行映射之类的功能。它在后台使用相同的 CLDR 文件。

于 2020-10-23T19:56:03.950 回答
1

另外的选择:

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

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

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

  4. 从重复项中过滤结果

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

于 2020-10-23T13:56:03.863 回答
1

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

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

于 2020-10-23T13:13:01.493 回答