Неверный часовой пояс в базе данных

#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 в своих регулярных обновлениях.