给定像“EST”这样的时区缩写,我可以使用timezone_name_from_abbr
. 是否有返回“东部标准时间”之类的函数?
3 回答
通常,您不应信任该timezone_name_from_abbr
函数,因为它仅返回找到的第一个具有匹配缩写的条目。时区缩写不是唯一的。例如,有 5 个不同的时区共享缩写“CST”。有关歧义的更多示例,请参见Wikipedia 上的此缩写列表。
作为 PHP 的特定情况,请考虑缩写“IST”。人们可能期望timezone_name_from_abbr("IST")
返回"Asia/Kolkata"
,代表印度标准时间。但是,它实际上返回"Asia/Jerusalem"
,代表以色列标准时间。两个时区都使用 IST 缩写,但"Asia/Jerusalem"
按字母顺序排在第一位。
考虑到这一点,您现在应该明白为什么函数在仅给定“EST”的情况下返回“东部标准时间”也是不切实际的。虽然 EST 可能是可行的,但并非在所有情况下都有效。还要考虑“东部标准时间”是英文的,并且对于不同的语言还有其他缩写和文字描述。
有一个项目包含您正在谈论的信息,它来自 Unicode,称为Common Locale Data Repository(或 CLDR)。使用 CLDR 数据,您将能够编写接受时区标识符(如"America/New_York"
)和语言/区域设置代码(如"en-US"
)并返回缩写“ET”、“EST”和“EDT”以及名称“东部时间”、“东部标准时间”和“东部夏令时间”。然后,您需要根据上下文和/或您所谈论的具体时间来决定使用哪个名称和缩写。
我已经为 .NET 编写了一个名为TimeZoneNames的库。对于 PHP,您需要类似的东西。我不知道要为 PHP 推荐一个特定的函数,但也许有人已经编写了一个,或者您可以通过直接使用 CLDR 源数据来创建所需的函数。
这是我一段时间以来一直在寻找的东西,并且看到其他人正在寻找与所需的最后一次推送相同的功能:)
webbit4me/timezone是一个 PHP 工具,可以帮助获取给定时区的名称、位置或偏移量。
该工具还为具有类似缩写的时区提供了一种解决方法。
即在Matt 的IST 示例中,我们有 3 个不同的时区
- 印度标准时间 (UTC +5:30)
- 爱尔兰标准时间 (UTC +1:00)
- 以色列标准时间 (UTC +2:00)
默认 IST 对象将引用第一次出现,然后我们将有 2 个对象 IST100 和 IST200 来处理爱尔兰和以色列标准时间。请注意100和200后缀来自时区的偏移量,例如 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 */