在PHP中了解时区的本地偏移量(当夏令时未激活时)

3
我希望给用户列出所有时区及其本地的UTC/GMT偏移量,不受夏令时的影响。如何实现?

http://php.net/manual/zh/timezones.phphttp://www.php.net/manual/zh/datetimezone.listabbreviations.php - Fivell
1
这与此相关,但似乎这个特定的问题没有被提出或回答。 - shealtiel
1个回答

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,均在指定的时区中指定。

它然后计算出今年的夏令时转换,并返回找到的第一个不处于活动状态的夏令时转换的偏移量。

需要PHP 5.3,因为调用了带有三个参数的DateTimeZone::getTransitions。如果您想在更早的版本中使用此功能,则需要承受性能损失,因为PHP会生成大量转换(在这种情况下,您不需要担心创建$startOfYear$startOfNext日期)。

我还测试了那些不遵从夏令时的时区(例如Asia/Calcutta),对它们也有效。

测试方法:

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

我希望不需要类似这样的东西,而且也不确定如何处理转换。谢谢。 - shealtiel

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