Подтвердить что ты не робот

Почему временные отметки PHP и MySQL unix расходятся в 1983-10-29?

Я использую функции 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 секунд.

Любые идеи?

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

4b9b3361

Ответ 1

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

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

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

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

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