Часовой пояс PHP Почему смещение равно нулю? - PullRequest
0 голосов
/ 25 апреля 2018

Я не могу понять, как работают часовые пояса.Почему этот код выдает ноль в качестве выхода?Разве он не должен возвращать 10800 вместо 0?

$myZone   = new DateTimeZone('+0300');
$utcZone  = new DateTimeZone('+0000');

$dateA = new DateTime('now', $myZone);
var_dump($utcZone->getOffset($dateA)); // 0

$dateA->setTimezone($utcZone);
var_dump($utcZone->getOffset($dateA)); // 0

$dateA->modify('+ 3600 seconds');
var_dump($utcZone->getOffset($dateA)); // 0

Кажется, что $ utcZone-> getOffset (...) не заботится о своем аргументе timezone и time diff вообще.Где логика?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

getOffset возвращает смещение, используемое часовым поясом в определенный момент.

Часовые пояса могут иметь более одного смещения в течение истории - наиболее распространенным случаем является летнее время, когда смещение изменяется в течение указанного периода. Поэтому в зависимости от времени года определенный часовой пояс может иметь различное смещение.

Параметр datetime определяет момент, который вы хотите проверить, а getOffset проверит историю часового пояса и вернет тот, который использовался в этот конкретный момент времени - независимо от того, какой часовой пояс является датой / временем. В документации вы можете найти пример этого: http://php.net/manual/en/datetimezone.getoffset.php#refsect1-datetimezone.getoffset-examples

Тем не менее, когда вы используете фиксированные значения смещения, такие как "+0000", это означает, что объект DateTimeZone всегда будет иметь это смещение, все время - оно никогда не изменится. Вот почему, когда вы вызываете $utcZone->getOffset, он всегда возвращает ноль, независимо от того, какой параметр datetime вы передаете.

Если вы хотите смещение даты, вызовите метод getOffset для объекта DateTime.

0 голосов
/ 25 апреля 2018
<?php

$myZone   = new DateTimeZone('+0300');
$utcZone  = new DateTimeZone('+0000');

$dateA = new DateTime('now', $myZone);


$timeOffset = $myZone->getOffset($dateA);
var_dump($timeOffset);

Этот вернет 10800, как вы сказали. Это было наоборот в getOffset.

вывод: int(10800)

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