Поиск…


замечания

Когда вам нужно обрабатывать информацию о времени для всемирной пользовательской базы в 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.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow