Хранение даты в MySQL с учетом часового пояса — непростая тема. Однако с ней обязательно нужно разобраться, чтобы сайты и приложения работали правильно.
Время и дату в MySQL можно указывать в TIMESTAMP и DATETIME.
- DATETIME — здесь время не зависит от часового пояса и выводится в том виде, в котором было изначально задано. Изменение времени в MySQL не позволяет изменить значение в DATETIME. Его удобно использовать для хранения дат.
- TIMESTAMP — абсолютное значение времени с начала эпохи Unix (с 00:00 1 января 1970 года). При выводе этого значения учитывается часовой пояс, который может быть указан для системы, MySQL в целом или конкретной сессии. Его удобно использовать для хранения времени публикаций на сайте, совершения заказов и других событий, которые происходят в режиме реального времени.
Для определения времени с учетом часового пояса MySQL можно отредактировать конфигурационный файл или использовать переменные. Мы рассмотрим оба способа.
Как установить время MySQL в конфигурационном файле
Самая большая проблема — найти конфигурационный файл my.cnf. Он может храниться как минимум в 5 местах:
- /etc/my.cnf
- /etc/mysql/my.cnf
- $MYSQL_HOME/my.cnf
- [datadir]/my.cnf
- ~/.my.cnf
Если вы нашли конфигурационный файл, то дальше уже сложностей не будет. Чтобы установить часовой пояс, добавьте в секцию [mysqld] следующую строку:
default-time-zone='+02:00'
В этом случае мы прибавляем 2 часа относительно UTC — всемирного координированного времени. Поддерживаются также другие значения:
- 'SYSTEM' — часовой пояс сервера совпадает с системным часовым поясом;
- именованный часовой пояс — например, 'Europe/Moscow'.
Чтобы применить конфигурацию, перезапустите MySQL.
Как установить часовой пояс MySQL через переменные
Чтобы изменить часовой через переменные в консоли, нужны права суперпользователя. Авторизуйтесь под root и укажите пароль. Затем посмотрите текущие дату и время. Сделать это можно командой
mysql> SELECT NOW();
Если хотите вывести только время (без даты), выполните в консоли
mysql> SELECT CURTIME();
Установить часовой пояс для конкретного пользователя можно через консоль, выполнив команду
SET time_zone = '+02:00';
В качестве примера мы поставили время, которое смещено относительно UTC на 2 часа. Однако у такого подхода есть большой недостаток. Если в стране принято переводить часы на летнее/зимнее время, то запрос обрабатывается неверно. В зависимости от текущего периода можно получить время на час больше или меньше. Чтобы устранить эту особенность, задайте временную зону в таком формате:
SET time_zone = 'Europe/Moscow';
Однако и у такого подхода есть свои подводные камни. Например, в стране могут измениться правила перехода на зимнее и летнее время. В России за последнее десятилетие это случилось два раза: сначала перешли на летнее время, отказавшись от зимнего, а затем сделали наоборот — отказались от летнего, оставив только зимнее. Поэтому нужно следить за актуальностью данных и вносить изменения в часовые пояса MySQL вручную.
Чтобы изменения сохранялись после перезагрузки и применялись ко всему серверу баз данных, используйте глобальную переменную:
SET GLOBAL time_zone = '+2:00';
или
SET GLOBAL time_zone = 'Europe/Moscow';
Также можно задавать время опционально для одной сессии. Для этого выполните команду
mysql> set @@session.time_zone = '+02:00';
Можно проверить, требуется ли задавать время для конкретной сессии, выполнив команду
mysql> SELECT @@global.time_zone, @@session.time_zone;
Если время сессии совпадает с системным, то задавать его отдельно не требуется.
Для корректной работы веб-приложения время PHP и MySQL должны совпадать. Если вы корректируете время в PHP, то нужно изменить часовой пояс MySQL, и наоборот.
Комментарии