PHP: почему этот код ошибочно возвращает ноль? - PullRequest
0 голосов
/ 24 января 2011

Я вычисляю смещение между двумя часовыми поясами, но я вижу результат, которого я не ожидаю (ноль) со следующим кодом:

$datetimezone_london = new DateTimeZone('Europe/London');  
$datetimezone_client = new DateTimeZone('Australia/Canberra');  
$now_client = new DateTime("now", $datetimezone_client);  
$offset = $datetimezone_london->getOffset($now_client);  
echo $offset;

Если я переверну строки часового пояса, этоработает, но, конечно, приведенный выше код тоже должен работать.Что происходит?

Ответы [ 2 ]

2 голосов
/ 24 января 2011

getOffset() возвращает смещение по Гринвичу в секундах, и Лондон в настоящее время в GMT, поэтому возвращаемое значение равно нулю.

Я считаю, что вместо этого вам нужно:

$tz_london = new DateTimeZone('Europe/London');  
$tz_client = new DateTimeZone('Australia/Canberra');
$time_london = new DateTime('now', $tz_london);  
$time_client = new DateTime('now', $tz_client);
$offset = $time_client->getOffset() - $time_london->getOffset();  
echo $offset;

В настоящее время (в январе) возвращается 39600 (11 часов).В июле он возвращает 9 часов, а в середине октября (где есть короткий период, когда Европа и Австралия переходят на летнее время) - 10 часов.

1 голос
/ 24 января 2011

DateTimeZone::getOffset() работает немного иначе, чем думает большинство людей. Он рассчитывает смещение по Гринвичу для экземпляра DateTimeZone смещение для даты, переданной в качестве параметра. Дата, переданная в качестве параметра, затем преобразуется в тот же часовой пояс, что и экземпляр (применяется DST и другие правила), и для этой даты рассчитывается смещение.

Итак, ваш код прямо сейчас вычисляет смещение часового пояса по Гринвичу Europe/London .. Поскольку Europe/London сейчас по Гринвичу (по сравнению с BMT), вы получаете 0. (Попробуйте дату в августе, вы получите 36000).

Если вы хотите текущую разницу между двумя часовыми поясами, используйте этот код ...

function timezone_diff($origin, $compareTo, $forDate = "now") {
    $dtzOrigin = new DateTimeZone($origin);
    $dtzCompareTo = new DateTimeZone($compareTo);

    $compareDate = new DateTime($forDate);

    $offsetOrigin = $dtzOrigin->getOffset($compareDate);
    $offsetCompareTo = $dtzCompareTo->getOffset($compareDate);

    return $offsetCompareTo - $offsetOrigin;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...