知道时区原生偏移(当DST不活动时)在php中

时间:2011-09-08 07:50:48

标签: php timezone

我想为用户列出所有具有原生UTC / GMT偏移的时区,无论DST

我该怎么做?

1 个答案:

答案 0 :(得分:2)

我已经拿出这个功能来完成这项工作:

function standard_tz_offset($timezone) {
    $now = new DateTime('now', $timezone);
    $year = $now->format('Y');

    $startOfYear = new DateTime('1/1/'.$year, $timezone);
    $startOfNext = new DateTime('1/1/'.($year + 1), $timezone);

    $transitions = $timezone->getTransitions($startOfYear->getTimestamp(),
                                             $startOfNext->getTimestamp());
    foreach($transitions as $transition) {
        if(!$transition['isdst']) {
            return $transition['offset'];
        }
    }

    return false;
}

工作原理

该函数接受一个时区并创建两个DateTime个对象:当年的1月1日00:00和下一年的1月1日00:00,两者都在该时区中指定。

然后计算今年的DST转换,并返回DST未激活的第一次转换的偏移量。

由于使用三个参数调用DateTimeZone::getTransitions

需要PHP 5.3 。如果你想在早期版本中使用它,你将不得不接受性能命中,因为PHP将生成大量的转换(在这种情况下,你不必费心去创建$startOfYear$startOfNext日期)。

我也用不遵守DST的时区测试了这个(例如Asia/Calcutta),它也适用于那些。

进行测试:

$timezone = new DateTimeZone("Europe/Athens");
echo standard_tz_offset($timezone);