Многие интернет-ресурсы написаны таким образом, что для корректной их работы требуется установка верной даты и времени (часового пояса) MySQL — а также указания часового пояса в настройках РНР. Часовой пояс является одной из настроек сервера баз данных и может задаваться локально, глобально или для текущей пользовательской сессии.
Чтобы определить время MySQL нужно редактировать конфигурационный файл (для большинства дистрибутивов он располагается по адресу /etc/mysql/my.cnf) или задавать переменные непосредственно в консоли сервера баз данных. Рассмотрим задание временной зоны при помощи переменных.
Авторизуемся в консоли MySQL (потребуется пароль пользователя root)
mysql -u root -p
При помощи запроса SELECT NOW(); можно просмотреть текущие дату и время MySQL
mysql> SELECT NOW();
+———————+
| NOW() |
+———————+
| 2017-08-31 21:21:56 |
+———————+
1 row in set (0.00 sec)
Можно вывести только время без даты. Для этого нужно выполнить запрос SELECT CURTIME();
mysql> SELECT CURTIME();
+————+
| CURTIME() |
+————+
| 21:24:16 |
+————+
1 row in set (0.00 sec)
Как установить часовой пояс в MySQL
Установить часовой пояс для определенного пользователя можно выполнив в консоли MySQL
SET time_zone = '+05:00';
Чтобы изменения сохранились после перезагрузки и имели силу для всего сервера баз данных нужно задать глобальную переменную:
SET GLOBAL time_zone = '+5:00';
Можно также указывать имя временной зоны — например, MSK для Москвы, но лучшей практикой является задавать часовой пояс определяя разницу с временем по Гринвичу как сделано выше
Также время опционально для конкретной сессии
mysql> set @@session.time_zone = '+00:00';
Можно выяснить требуется ли задавать время для сессии выполнив:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+———————+———————+
| @@global.time_zone | @@session.time_zone |
+———————+———————+
| SYSTEM | SYSTEM |
+———————+———————+
1 row in set (0.00 sec)
В данном случае время сессии совпадает с системным и непосредственное его задание не требуется.
Время в MySQL может указываться в TIMESTAMP и DATETIME
- DATETIME (значение занимает 8 байт) — время не зависит от временной зоны и выводится в том виде, в котором было задано. Изменив время в MySQL изменить значение в DATETIME нельзя (может меняться при установке времени для сессии). Выводится в виде YYYY-MM-DD-HH-MM-SS
- TIMESTAMP (значение занимает 4 байта) является абсолютным значением времени с начала эпохи Unix — с полуночи 1 января 1970 года, при выводе из базы учитывается часовой пояс (указанный для системы, MySQL в целом или сессии MySQL), именно значение в TIMESTAMP обычно приходится корректировать. Значение TIMESTAMP выводится запросом SELECT NOW(); — TIMESTAMP же корректируется всеми приведенными в данном материале командами.
Общее правило для корректной работы приложения — время РНР должно совпадать с временем MySQL. Если корректируется время в РНР, то скорректировать его нужно и в MySQL.
Чаще всего на практике для сервера на котором работают один или несколько сайтов полезной оказывается команда:
SET GLOBAL time_zone = '+5:00';
Кроме часового пояса MySQL приходится задавать часовой пояс в настройках РНР и системное время на сервере.