MySQL
Обработка временных зон
Поиск…
замечания
Когда вам нужно обрабатывать информацию о времени для всемирной пользовательской базы в MySQL, используйте тип данных TIMESTAMP в своих таблицах.
Для каждого пользователя сохраните столбец часового пояса пользователя. VARCHAR (64) - хороший тип данных для этого столбца. Когда пользователь регистрируется для использования вашей системы, запросите значение часового пояса. Мое - Атлантическое время, America/Edmonton
. Может быть, может быть, может быть Asia/Kolkata
или Australia/NSW
. Для пользовательского интерфейса для этого параметра предпочтения пользователя, WordPress.org имеет хороший пример.
Наконец, всякий раз, когда вы устанавливаете соединение с вашей хост-программой (Java, php, что угодно) в вашу СУБД от имени пользователя, выполните команду SQL
SET SESSION time_zone='(whatever tz string the user gave you)'
прежде чем обращаться с любыми пользовательскими данными, связанными с временем. Затем все время TIMESTAMP
вы установили, будет отображаться в локальное время пользователя.
Это приведет к тому, что все ваши таблицы будут конвертированы в UTC и все время будут переведены на локальный. Он корректно работает для NOW () и CURDATE (). Опять же, для этого вы должны использовать TIMESTAMP, а не DATETIME или DATE.
Убедитесь, что для вашей серверной ОС и часовых поясов MySQL по умолчанию установлено значение UTC. Если вы не сделаете этого, прежде чем вы начнете загружать информацию в свою базу данных, ее будет практически невозможно исправить. Если вы используете поставщика для запуска MySQL, настаивайте на том, что это правильно.
Получить текущую дату и время в определенном часовом поясе.
Это получает значение NOW()
по местному времени, в стандартное время Индии, а затем снова в UTC.
SELECT NOW();
SET time_zone='Asia/Kolkata';
SELECT NOW();
SET time_zone='UTC';
SELECT NOW();
Преобразовать сохраненное значение DATE или DATETIME в другой часовой пояс.
Если у вас есть сохраненный DATE
или DATETIME
(в каком-то столбце), он хранился в отношении некоторого часового пояса, но в MySQL часовой пояс не сохраняется со значением. Итак, если вы хотите преобразовать его в другой часовой пояс, вы можете, но вы должны знать исходный часовой пояс. Использование CONVERT_TZ()
делает преобразование. В этом примере показаны строки, проданные в Калифорнии по местному времени.
SELECT CONVERT_TZ(date_sold,'UTC','America/Los_Angeles') date_sold_local
FROM sales
WHERE state_sold = 'CA'
Получить сохраненные значения TIMESTAMP в определенном часовом поясе
Это очень просто. Все значения TIMESTAMP
сохраняются в универсальном времени и всегда преобразуются в time_zone
настройку time_zone
всякий раз, когда они отображаются.
SET SESSION time_zone='America/Los_Angeles';
SELECT timestamp_sold
FROM sales
WHERE state_sold = 'CA'
Почему это? Значения TIMESTAMP
основаны на почтенном типе данных UNIX time_t
. Эти временные метки UNIX сохраняются как количество секунд с 1970-01-01 00:00:00
UTC.
Уведомление Значения TIMESTAMP
хранятся в универсальном времени. Значения DATE
и DATETIME
сохраняются в любое местное время, когда они были сохранены.
Какова локальная настройка часового пояса моего сервера?
На каждом сервере установлен глобальный параметр time_zone по умолчанию, настроенный владельцем серверной машины. Вы можете определить текущий часовой пояс таким образом:
SELECT @@time_zone
К сожалению, это обычно дает значение SYSTEM
, а это означает, что время MySQL определяется настройкой часового пояса OS сервера.
Эта последовательность запросов (да, это взлом ) возвращает вам смещение в минутах между настройкой часового пояса сервера и UTC.
CREATE TEMPORARY TABLE times (dt DATETIME, ts TIMESTAMP);
SET time_zone = 'UTC';
INSERT INTO times VALUES(NOW(), NOW());
SET time_zone = 'SYSTEM';
SELECT dt, ts, TIMESTAMPDIFF(MINUTE, dt, ts)offset FROM times;
DROP TEMPORARY TABLE times;
Как это работает? Эти две колонки во временной таблице с разными типами данных являются ключом. Типы данных DATETIME
всегда хранятся в локальном времени в таблицах, а TIMESTAMP
s - в формате UTC. Таким образом, оператор INSERT
, выполняемый, когда time_zone установлен в UTC, сохраняет два идентичных значения даты / времени.
Затем оператор SELECT выполняется, когда для параметра time_zone задано локальное время сервера. TIMESTAMP
s всегда переводится с сохраненной формы UTC в локальное время в операторы SELECT. DATETIME
- нет. Таким образом, операция TIMESTAMPDIFF(MINUTE...)
вычисляет разницу между локальным и универсальным временем.
Какие значения time_zone доступны на моем сервере?
Чтобы получить список возможных значений time_zone в экземпляре сервера MySQL, используйте эту команду.
SELECT mysql.time_zone_name.name
Обычно это показывает список зон зон ZoneInfo, поддерживаемый Полом Эггерт в авторитете Интернет-назначенных номеров . Во всем мире имеется около 600 часовых поясов.
Unix-подобные операционные системы (дистрибутивы Linux, дистрибутивы BSD и современные дистрибутивы Mac OS), например, получают обычные обновления. Установка этих обновлений в операционной системе позволяет экземплярам MySQL, работающим там, отслеживать изменения в часовом поясе и перехода на дневное / стандартное время.
Если вы получаете гораздо более короткий список имен часовых поясов, ваш сервер либо не полностью настроен, либо работает в Windows. Ниже приведены инструкции для администратора вашего сервера для установки и ведения списка ZoneInfo.