При использовании класса PHP DateTime
и попытке установить DateTimeZone
я получаю разные результаты в зависимости от того, как я его устанавливал: используя конструкцию DateTime::__construct
или используя метод DateTime::setTimezone
.
вот пример:
$date = '2014-08-01' $dateTimeOne = new DateTime($date, new DateTimeZone('America/Los_Angeles')); echo $dateTimeOne->format('Ymd\TH:i:sP'); // 2014-08-01T00:00:00-07:00 $dateTimeTwo = new DateTime($date); $dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles')); echo $dateTimeTwo->format('Ymd\TH:i:sP'); // 2014-07-31T17:00:00-07:00
См. Также http://3v4l.org/LrZfM
Я огляделся и не нашел адекватного объяснения, которое учитывает это конкретное поведение, отличное от следующего комментария в php docs: datetime.settimezone и книге php | Руководство администратора по программированию даты и времени: Работа с часовыми поясами – DateTimeZone .
В комментарии указано, что метод DateTime::setTimezone
изменит часовой пояс для определенного момента времени (отметка времени), но отметка времени Unix останется неизменной.
С другой стороны, параметр DateTime::__construct
используется для «перезаписывания текущего часового пояса по умолчанию с помощью определенного пользователем». Глава 3: Работа с часовыми поясами – DateTimeZone .
Кроме этого, на этот вопрос мало что (что я смог найти).
Это то, что я хотел бы знать:
DateTime::__construct
для установки часового пояса DateTime::setTimezone
для установки часового пояса Это нормальное поведение.
Если вы не укажете часовой пояс в конструкторе, используется часовой пояс по умолчанию, то есть то, что было установлено с помощью date_default_timezone_set ().
Когда вы звоните:
$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles'));
Он перемещает дату, установленную в часовой пояс по умолчанию, в новый часовой пояс.
1) (конструктор), установленный в 'America / Los_Angeles'
2) (setter) установить дату в часовой пояс по умолчанию, переместить дату в 'America / Los_Angeles'
Ваш часовой пояс по умолчанию был, вероятно, UTC или что-то близкое. Вы сказали компьютеру установить 2014-08-01 в UTC. Затем вы попросили переключиться на часовой пояс America / Los_Angeles, что на 7 часов раньше, таким образом, изменив дату до 2014-07-31 в 17:00.