Как заставить функции MySQL NOW () и CURDATE () использовать UTC? - PullRequest
42 голосов
/ 04 июня 2009

Я хочу сделать так, чтобы вызовы NOW () и CURDATE () в запросах MySQL возвращали дату в UTC. Как мне сделать это, не проходя и не меняя все запросы, которые используют эти функции?

Ответы [ 7 ]

35 голосов
/ 04 июня 2009

Наконец-то нашел то, что искал ...

В my.cnf,

[mysqld_safe]
timezone = UTC

Я помещал эту опцию в [mysqld], и mysql не запускался.

Вызов "SET time_zone = '+ 0:00';" загрузка каждой страницы также будет работать, но мне не нравится идея вызова этого запроса при каждой загрузке страницы.

24 голосов
/ 04 июня 2009

Установите часы вашего сервера в UTC. Нет, правда.

Если вы можете это сделать, сделайте это.

Одна из самых больших головных болей - задания "cron" и т. Д., Выполняющиеся в местном часовом поясе, это означает, что некоторые задания cron будут пропускаться раз в год, а все остальные выполняются в другое время по Гринвичу в течение полугода я предполагаю, что вы находитесь в часовом поясе с летним временем).

В MySQL есть поддержка часовых поясов, но это безумие и ошибка. Не используйте это, если вам не нужно. Просто установите часы сервера на UTC, и время начнет работать так, как должно.

Я знаю, что изменение часов сервера является серьезным изменением для любой управляемой системы, и у вас может быть большое количество серверов и служб, которые могут быть затронуты, но, пожалуйста, попробуйте сделать это в любом случае. Работа QA может быть значительной, но попробуйте.

14 голосов
/ 13 апреля 2011

Перейдите в файл /etc/mysql/my.cnf и добавьте следующую строку в раздел [mysqld]

default-time-zone = '+00: 00'

Тогда перезапусти свой mysql. Теперь выберите curtime (); показывает время по Гринвичу.

8 голосов
/ 03 марта 2015

Если изменение часового пояса на работающих серверах или обновление ключевого параметра конфигурации и перезапуск MySQL кажутся нереальными и / или излишними, попробуйте следующее:

CONVERT_TZ(NOW(), 'US/Pacific', 'UTC')

Где US/Pacific - часовой пояс, по которому ваш NOW() вызов возвращает время.

4 голосов
/ 04 июня 2009

Правильный способ сделать это - изменить часовой пояс вашего сервера на UTC, как сказал MarkR.

Однако также можно использовать SET time_zone , чтобы изменить часовой пояс для текущего сеанса.

Из руководства:

Текущая настройка часового пояса сеанса влияет на отображение и хранение значений времени, которые зависят от зоны. Это включает значения, отображаемые такими функциями, как NOW () или CURTIME ()

0 голосов
/ 11 июня 2019
UTC_TIMESTAMP()

Возвращает текущую дату и время UTC в виде значения в формате «ГГГГ-ММ-ДД чч: мм: сс» или ГГГГММДДччммсс.уууууу, в зависимости от того, используется ли функция в строковом или числовом контексте.

UTC_DATE()

Возвращает текущую дату UTC в виде значения в формате «ГГГГ-ММ-ДД» или ГГГГММДД в ​​зависимости от того, используется ли функция в строковом или числовом контексте.

UTC_TIME()

Возвращает текущее время UTC в виде значения в формате «чч: мм: сс» или hhmmss.uuuuuu в зависимости от того, используется ли функция в строковом или числовом контексте.

Ссылка на MySQL: https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_utc-timestamp

0 голосов
/ 04 июня 2009

Вам нужно будет использовать инструкцию SET TIMESTAMP для форматирования результатов даты и времени в желаемом формате. Это будет означать изменение всех этих запросов. sysdate () не будет подчиняться этому.

...