在 PHP 中获取更长的时区名称

Get longer time zone name in PHP

给定像 "EST" 这样的时区缩写,我可以使用 timezone_name_from_abbr 得到 "America/New York"。有没有 returns 类似 "Eastern Standard Time" 的函数?

一般来说,您不应该信任 timezone_name_from_abbr 函数,因为它只是 return 它找到的具有匹配缩写的 第一个 条目。时区缩写不是唯一的。例如,有 5 个不同的时区共享缩写 "CST"。有关更多歧义示例,请参阅维基百科 this list of abbreviations

作为 PHP 的特殊情况,考虑缩写 "IST"。人们可能会期望 timezone_name_from_abbr("IST") 到 return "Asia/Kolkata",代表印度标准时间。然而,它实际上是 returns "Asia/Jerusalem",代表以色列标准时间。两个时区都使用 IST 缩写,但 "Asia/Jerusalem" 按字母顺序排在第一位。

考虑到这一点,您现在应该明白为什么仅给定 "EST" return "Eastern Standard Time" 的函数也不实用。虽然 EST 可能可行,但并非在所有情况下都有效。还要考虑 "Eastern Standard Time" 在 英语 中,并且还有其他缩写和不同语言的文本描述。

有一个项目包含您正在谈论的信息,它来自 Unicode,称为 Common Locale Data Repository(或 CLDR)。使用 CLDR 数据,您将能够编写接受时区标识符(例如 "America/New_York")和 language/locale 代码(例如 "en-US")和 return 缩写的函数"ET"、"EST" 和 "EDT",以及名称 "Eastern Time"、"Eastern Standard Time" 和 "Eastern Daylight Time"。然后,您需要根据上下文 and/or 您所谈论的具体时间来决定使用哪个名称和缩写。

我已经为 .NET 编写了这样一个库,称为 TimeZoneNames。 PHP 需要类似的东西。我不知道有什么可以推荐给 PHP,但也许有人已经写了一个,或者您可以通过直接使用 CLDR 源数据来创建您需要的函数。

这是我追求了一段时间的东西,看到其他人正在寻找相同的功能,这是我最后一次推送所需的功能:)

webit4me/timezone,是一个 PHP 工具,可以帮助获取给定时区的名称、位置或偏移量。

该工具还为具有类似缩写的时区提供了解决方法。

即在 IST 的 中,我们有 3 个不同的时区

  1. 印度标准时间 (UTC +5:30)
  2. 爱尔兰标准时间 (UTC +1:00)
  3. 以色列标准时间 (UTC +2:00)

默认 IST 对象将引用第一次出现,然后我们将有 2 个对象 IST100 和 IST200 来处理爱尔兰和以色列标准时间。请注意 100200 后缀来自时区的 offsets 例如UTC +1:30 将是 130.

希望这个包会有所帮助,如果需要,请随时加入并做出调整 http://github.com/webit4me/timezone

从缩写中获取更长的名称是不可靠的,但是如果您使用 DateTime 对象,并且在设置默认时区或创建 DateTime 对象时使用长名称。在格式字符串中使用 T 将为您提供 3 个字母的缩写,但您可以获得如下所示的长名称:

date_default_timezone_set('America/Chicago');
$date = new DateTime('2/3/2022 02:11:17');

echo "\n" . $date->format('Y-m-d h:i:s T');
/* Displays 2022-02-03 02:11:17 CST "; */

$t = $date->getTimezone();
echo "\nTimezone: " . $t->getName();
/* Displays Timezone: America/Chicago */