Почему PHP и MySQL Unix метки времени расходятся в 1983-10-29? - PullRequest
29 голосов
/ 02 июня 2011

Я использовал функции PHP strtotime и MySQL UNIX_TIMESTAMP в своем приложении для преобразования дат в метки времени. PHP и MySQL работают на моей локальной машине, и эти функции обычно возвращают один и тот же результат, как я ожидаю:

$ php
<?php echo strtotime("2011-06-02"); ?>
1307001600

mysql> SELECT UNIX_TIMESTAMP("2011-06-02") ts;
+------------+
| ts         |
+------------+
| 1307001600 |
+------------+

Но, случайно, я заметил, что когда я ввел 1983-01-01 в качестве даты, результаты уже не были равны:

$ php
<?php echo strtotime("1983-01-01"); ?>
410263200

mysql> SELECT UNIX_TIMESTAMP("1983-01-01") ts;
+-----------+
| ts        |
+-----------+
| 410256000 |
+-----------+

Как видите, PHP вернул 410263200, а MySQL вернул 410256000 - разница в 7200 секунд.

Это меня заинтересовало, и я хотел узнать, на какую дату метки времени больше не эквивалентны, поэтому я написал небольшую программу, которая начинается с сегодняшней даты (в формате Ymd), использует PHP strtotime и MySQL UNIX_TIMESTAMP и сравнивает результаты. Затем он вычитает 1 день из каждого значения и повторяет циклы, пока они больше не будут равны.

Результат:

1983-10-29

29 октября 1983 года по некоторым причинам strtotime и UNIX_TIMESTAMP возвращают значения, отличающиеся на 7200 секунд.

Есть идеи?

Спасибо за чтение.

1 Ответ

22 голосов
/ 02 июня 2011

Вы говорите, что находитесь на аляскинском времени. От http://www.statoids.com/tus.html:

1983-10-30 02:00: Все части Аляски, кроме Алеутских островов и острова Святого Лаврентия, перешли на АТ. До изменения Аляска к востоку от 138 ° западной долготы (Джуно) была на ПТ; между 138 ° и 141 ° з.д. (якутат) было по Юконскому времени, которое было UTC-9 с ТЛЧ; к западу от 162 ° з.д. (Ном) находился в Беринговом времени, которое было UTC-11 с DST. Название зоны Аляска-Гавайи изменено на Гавайско-Алеутское.

Итак, я предполагаю, что это потому, что ваш часовой пояс изменился на два часа (7200 секунд = 2 часа) 30 октября 1983 года.

Я предполагаю, что UNIX_TIMESTAMP в MySQL использует часовой пояс, отличный от вашего аляскинского параметра в PHP, который может быть либо сервером по умолчанию, либо зависеть от настроек вашего соединения, поэтому они расходятся при достижении этой даты.

Вы можете получить больше информации, спросив MySQL, как настроен часовой пояс для этого соединения с SELECT @@global.time_zone, @@session.time_zone;; см. этот ответ для получения дополнительной информации о выводе и как его интерпретировать.

...