PHP - 奇怪的时区偏移

时间:2010-12-10 18:22:07

标签: php timezone offset

我遇到了一个我无法理解的愚蠢问题。 接下来的代码怎么样:

public function getFormattedOffsetFrom($refTimezoneId = 'Europe/Paris', $format = 'G\hi') {
    $timestamp = time();
    $reference = new DateTime('@'.$timestamp);
    $referenceTimeZone = new DateTimeZone($refTimezoneId);
    $reference->setTimezone($referenceTimeZone);
    $datetime = new DateTime('@'.$timestamp);
    $datetime->setTimezone($this->timezone);
    $offset = $this->timezone->getOffset($datetime) - $referenceTimeZone->getOffset($reference);
    $prefix = '+';
    if($offset < 0) {
        $prefix = '-';
        $offset = abs($offset);
    }
    return $prefix.date($format, $offset);
}

其中$ this-&gt; timezone是位于欧洲/马德里的DateTimeZone实例,当没有指定args时产生+ 1h00 ????

巴黎和马德里没有时间抵消。我只是不明白。

非常感谢你的帮助!!!! Florent的

2 个答案:

答案 0 :(得分:2)

为什么要0?西班牙和法国都使用GMT + 1作为时区。

http://en.wikipedia.org/wiki/File:Time_zones_of_Europe.svg

问题在于您尝试使用函数$offset格式化保持时间差的date(),其中函数$offset == 0将时间戳作为第二个参数。如果date $offsetH = floor( $offset / 3600 ); //full hours $offsetM = floor(($offset - $offsetH) / 60 ); //full minutes return sprintf("%s%sh%02s",$prefix,$offsetH,$offsetM) ; 功能将其识别为 1970-01-01 00:00:00 GMT ,那么在您的时区中它将 1970-01-01 01:00:00 GMT + 1 ,您正在使用格式返回小时和分钟,这就是为什么您输入+1的原因。

您必须手动格式化此时差:

{{1}}

答案 1 :(得分:1)

问题可以减少到date('G', 0)给出“1”。解决方案是使用gmdate()