Сохранение Даты В Mysql С Учетом Часового Пояса



Сохранение Даты В Mysql С Учетом Часового Пояса

Статья о том, как не путаться с датами, хранящимися в MySQL. Эта путаница возникает по двум причинам: 1. В разных районах нашей планеты наблюдаются разные временные сдвиги.

2. Некоторые страны переходят на летнее время и обратно( Карта стран, переходящих на летнее время ).

Многие люди решают эти проблемы по-разному.

Некоторые люди сдвигают дату в запросах SQL, другие — в PHP. Некоторые люди хранят даты в TIMESTAMP, другие в DATETIME. Перерыл много источников, но нигде не нашел правильного решения этой проблемы на русском языке.

В собственной документации MySQL я нашел информацию о том, как добиться правильного автоматического преобразования TIMESTAMP в местное время, но и здесь есть свои подводные камни.

Если в php настроить часовой пояс легко, то в mysql возникают трудности, особенно если доступ к серверу mysql у вас ограничен и некоторые таблицы там еще не установлены.

Надеюсь, вы знаете, в чем разница между форматами хранения дат TIMESTAMP и DATETIME. Значение TIMESTAMP — это абсолютное значение времени, не зависящее от локальных настроек.

В любой стране, на любом компьютере одно и то же.

Поэтому в большинстве случаев дату лучше хранить в TIMESTAMP. Если вы сделаете запрос SELECT `timestamp_field` FROM table вы получите дату в формате «гггг-мм-дд чч:мм:сс».

Казалось бы, все просто.

А эта простота слишком заманчива и именно из-за нее могут возникнуть проблемы, ведь нужно указать, в каком часовом поясе находится пользователь, для которого получается дата.

И решение есть: можно задать зону запросом SET time_zone='+03:00' где «+03:00» — это текущая дата, смещенная от нулевого времени Лондона.

Но после этого запроса mysql начинает некорректно обрабатывать летнее время.

Если для параметра time_zone установлено значение SYSTEM (по умолчанию), летнее время обрабатывается правильно.

Например, сейчас лето и действует летнее время.

Нам нужно преобразовать хранящуюся в базе данных TIMESTAMP в местное время.

Его значение 946681261 (это '2000-01-01 01:01:01' по киевскому времени) Делаем запрос: SET time_zone = 'SYSTEM'; SELECT NOW(), FROM_UNIXTIME(946681261); Получаем результат:

СЕЙЧАС() FROM_UNIXTIME(946681261)
2009-09-14 16:00:40 2000-01-01 01:01:01
Теперь давайте изменим часовой пояс SET time_zone = '+03:00'; SELECT NOW(), FROM_UNIXTIME(946681261);
СЕЙЧАС() FROM_UNIXTIME(946681261)
2009-09-14 16:00:40 2000-01-01 02:01:01
Как видите, вместо ожидаемого «2000-01-01 01:01:01» мы получили на час больше времени.

При этом текущее время отображается корректно.

Вы можете настроить mysql по мере необходимости (хорошо, если у вас есть полный доступ к базе данных) и установить часовой пояс в формате SET time_zone = 'America/Toronto'; После этого может показаться, что все проблемы исчезнут. Но и здесь могут быть сюрпризы.

Например, в 2007 году в США, Мексике и Канаде произошли некоторые изменения в правилах перехода на летнее время.

А поскольку данные о часовых поясах вводятся в MySQL вручную, необходимо следить за актуальностью данных.

Еще хуже: например, если вы используете PHP, вам нужно убедиться, что данные о часовом поясе в MySQL совпадают с данными в PHP — а это гораздо сложнее.

Поэтому лучшим решением, если вы используете PHP, является следующее: 1. Сохраните дату в MySQL в TIMESTAMP. 2. В PHP всегда устанавливайте часовой пояс пользователя с помощью функции date_default_timezone_set() 3. Получите значение TIMESTAMP из базы данных и преобразуйте его в нужный формат на PHP с помощью функции date($format, $timestamp); По крайней мере, пока 2038 можете быть уверены, что не возникнет путаницы с датами.

Обновлять: перенесен в блог MySQL Теги: #MySQL #php #time_zone #date #datetime #timestamp #MySQL

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2011-09-06 20:50:56
Баллов опыта: 544
Всего постов на сайте: 4
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.