#mysql #datetime #timezone #zoneinfo
#mysql #дата-время #Часовой пояс #zoneinfo
Вопрос:
Я установил дату с помощью функции CURRENT_TIMESTAMP в phpmyadmin. И выходное значение часов неверно на 1 час. Я попытался изменить его в mysql, используя SET TIME_ZONE = ' 01:00';
Однако он все равно отправит дату на 1 час раньше. Есть предложения?
Ответ №1:
Вы затрагиваете сложную тему.
Когда столбец таблицы имеет TIMESTAMP
тип данных, все значения сохраняются в UTC после перевода из вашей текущей time_zone
настройки в UTC. Когда вы извлекаете значения из этих столбцов, они преобразуются обратно в ваш текущий time_zone
. Это удобно, потому что вы можете предоставлять метки данных пользователям по всему миру в их собственном локальном времени, рассматривая time_zone
как предпочтения пользователя.
Когда столбец имеет DATETIME
тип данных, переводы не происходят.
Вот пример:
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
SET time_zone = 'UTC';
INSERT INTO t1 (ts, dt) VALUES (NOW(), NOW());
SET time_zone = 'Europe/Paris';
INSERT INTO t1 (ts, dt) VALUES (NOW(), NOW());
SET time_zone = 'UTC';
SELECT * FROM t1; /* notice differences presentation of ts columns, ds stay the same */
SET time_zone = 'Europe/Paris';
SELECT * FROM t1; /* again */
SET time_zone = 'America/Halifax';
SELECT * FROM t1; /* again */
Совет профессионала: Если вы используете именованные часовые пояса Europe/Paris
, вы автоматически получите преимущества правил дневного времени для выбранной вами локали. Правила, известные как база данных zoneinfo, поддерживаются IANA. Многие дистрибутивы Linux включают изменения в базу данных zoneinfo в своих регулярных обновлениях.