转换已弃用的时区php

问题描述

我正在将Windows时区映射到IANA,请使用此来源https://www.php.net/manual/fr/function.empty.php

但是问题在于,对于其中的一些人,只有过时的PHP列表https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/windowsZones.xml中的IANA名称

"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/可以从此表https://en.wikipedia.org/wiki/List_of_tz_database_time_zones中获取csv文件。 我认为这些数据不会很快更改,因此您可以下载一次并保存在项目中。

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

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

  4. 从重复项中过滤结果

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

,

对于用户或开发人员为其应用程序选择特定时区,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区域映射文件的结果。除非您要尝试提供规范的结果,否则无需对区域链接进行任何其他转换。

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