如何在PHP中获取时区名称和缩写?

18

如果你有一个时区标识符,比如"America/Los_Angeles",在PHP中如何找到该时区的名称和缩写?例如:

'PST', 'Pacific Standard Time', 'PDT', 'Pacific Daylight Time'

如果只需要短缩写('PST'和'PDT'),那就可以了。
我查看了DateTimeZone::listAbbreviations(),并尝试检查它以查看哪些与我的ID相对应,但是对于America/Los_Angeles,它找到了“PST”,“PDT”,“PPT”和“PWT”,这有点奇怪。

根据 https://github.com/eggert/tz/blob/master/northamerica#L146,看起来 PWT 和 PPT 中的 "W" 和 "P" 分别代表 "战争" 和 "和平"。 - gvl
5个回答

16

希望这能对你有所帮助。

<?php
    date_default_timezone_set('Europe/Sofia');
    echo date_default_timezone_get(); // Europe/Sofia
    echo ' => '.date('T'); // => EET
?>

2
谢谢,但这只解决了一半的问题。我已经有了ID(“Europe/Sofia”),我正在寻找时区本身的名称(“东欧时间”/“东欧夏令时”)。 - nickf

11

希望这能帮到你:

function get_timezone_abbreviation($timezone_id)
{
    if($timezone_id){
        $abb_list = timezone_abbreviations_list();

        $abb_array = array();
        foreach ($abb_list as $abb_key => $abb_val) {
            foreach ($abb_val as $key => $value) {
                $value['abb'] = $abb_key;
                array_push($abb_array, $value);
            }
        }

        foreach ($abb_array as $key => $value) {
            if($value['timezone_id'] == $timezone_id){
                return strtoupper($value['abb']);
            }
        }
    }
    return FALSE;
}
get_timezone_abbreviation('America/New_York');
And you get:
EDT

echo get_timezone_abbreviation('Asia/Kolkata');无法正常工作。 - Debesh Nayak
@DebeshNayak 你使用的 PHP 版本是什么? - Joe L.
@DebeshNayak,我刚在几个版本的PHP中测试过,它可以工作。请看这里:http://take.ms/Pp0Ws - Joe L.

8
希望这能对你有所帮助。
<?php
$dateTime = new DateTime();
$dateTime->setTimeZone(new DateTimeZone('America/Havana'));
echo $dateTime->format('T');
?>

4

问题在于,时区名称取决于一年中的时间,例如在冬季是CET,在夏季是CEST。

我们可以通过使用当前日期和时间来获取时区的名称。

$timezone = 'Pacific/Midway';
$dt = new DateTime('now', new DateTimeZone($timezone));
$abbreviation = $dt->format('T'); // SST

它只支持php知道的时区,它不知道"Pacific Standard Time"是什么。

在这里,您可以看到它如何在CET和CEST之间切换。

    $t = new CDateTime('2015-09-22 11:00', new DateTimeZone('CET'));
    $t->format('T'); // CEST

    $t = new CDateTime('2015-12-22 11:00', new DateTimeZone('CET'));
    $t->format('T'); // CET

1

看起来Symphony有相关的方法,例如select_timezone_tag。你可以查看他们的源代码来了解它是如何实现的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接