PHP DateTime Timezones – метод Constructor vs Setter

При использовании класса 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 для установки часового пояса
  • Ясный пример использования одного против другого или как его использовать совместно

Related of "PHP DateTime Timezones – метод Constructor vs Setter"

Это нормальное поведение.

Если вы не укажете часовой пояс в конструкторе, используется часовой пояс по умолчанию, то есть то, что было установлено с помощью 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.