【发布时间】:2015-06-19 18:02:07
【问题描述】:
给定像“EST”这样的时区缩写,我可以使用timezone_name_from_abbr 得到“America/New York”。有没有返回类似“东部标准时间”的函数?
【问题讨论】:
标签: php timezone abbreviation
给定像“EST”这样的时区缩写,我可以使用timezone_name_from_abbr 得到“America/New York”。有没有返回类似“东部标准时间”的函数?
【问题讨论】:
标签: php timezone abbreviation
一般来说,您不应该信任timezone_name_from_abbr 函数,因为它只返回它找到的带有匹配缩写的first 条目。时区缩写不是唯一的。例如,有 5 个不同的时区共享缩写“CST”。有关歧义的更多示例,请参阅维基百科上的 this list of abbreviations。
作为 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 源数据来创建你需要的函数。
【讨论】:
这是我追求了一段时间的东西,并且看到其他人正在寻找与上次推送所需的相同的功能:)
webit4me/timezone,是一个 PHP 工具,可以帮助获取给定时区的名称、位置或偏移量。
该工具还为具有类似缩写的时区提供了一种解决方法。
即在 Matt's example 的 IST 中,我们有 3 个不同的时区
默认 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 */
【讨论】: