Настройка часового пояса MySQL

Обсудить
Часовой пояс MySQL

Хранение даты в 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, и наоборот.

Комментарии