PHP - странное смещение часового пояса - PullRequest
1 голос
/ 10 декабря 2010

Я столкнулся с глупой проблемой, которую просто не могу понять. Как получается, что следующий фрагмент кода:

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-> timezone является экземпляром DateTimeZone, расположенным в Европе / Мадриде, выдает + 1h00, когда аргументы не указаны ????

В Париже и Мадриде нет смещения времени. Я просто не понимаю.

Большое спасибо за вашу помощь !!!! Флоран

Ответы [ 2 ]

2 голосов
/ 11 декабря 2010

Почему должно быть 0?И Испания, и Франция используют GMT + 1 в качестве часового пояса.

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

Проблема в том, что вы пытаетесь отформатировать $offset, который содержит разницу во времени в секундах, с помощью функции date(), который ожидает отметку времени в качестве второго параметра.Если функция $offset == 0 date распознает ее как 1970-01-01 00:00:00 GMT , то в вашем часовом поясе это будет 1970-01-01 01:00:00GMT + 1 , и вы используете формат для возврата часов и минут, поэтому у вас есть +1 в качестве вывода.

Вы должны вручную отформатировать эту разницу во времени следующим образом:

$offsetH = floor( $offset / 3600 ); //full hours
$offsetM = floor(($offset - $offsetH) / 60 ); //full minutes

return sprintf("%s%sh%02s",$prefix,$offsetH,$offsetM) ;
1 голос
/ 11 декабря 2010

Проблема может быть уменьшена до date('G', 0), давая «1».Решение заключается в использовании gmdate().

...