Я хочу сделать так, чтобы вызовы NOW() и CURDATE() в запросах MySQL возвращали дату в UTC. Как это сделать, не проходя и не изменяя все запросы, которые используют эти функции?
Как я могу использовать функции MySQL NOW() и CURDATE(), используя UTC?
Ответ 1
Наконец нашел то, что искал...
В my.cnf,
[mysqld_safe]
timezone = UTC
Я помещал эту опцию в [mysqld], и mysql не запускался.
Вызов "SET time_zone = '+ 0:00';" на каждой загрузке страницы также будет работать, но мне не нравится идея вызова этого запроса при загрузке каждой страницы.
Ответ 2
Установите часы сервера в UTC. На самом деле нет.
Если вы можете это сделать, сделайте это.
Одной из самых больших головных болей является работа "cron" и т.д., работающая в местном часовом поясе, это означает, что некоторые задания cron будут пропущены один раз в год, а все остальные будут работать в другое время GMT в течение полугода (I Предполагая, что вы находитесь в часовом поясе, где есть летнее время).
У MySQL есть поддержка часового пояса, но она сумасшедшая и перепутанная. Не используйте его, если вам это не нужно. Просто установите часы сервера на UTC, и время начнет работать, как должно быть.
Я знаю, что изменение часов сервера является серьезным изменением для любой управляемой системы, и у вас может быть большое количество серверов и служб, которые могут быть затронуты, но, пожалуйста, попробуйте сделать это в любом случае. Работа QA может быть значительной, но попробуйте.
Ответ 3
Откройте файл /etc/mysql/my.cnf и добавьте эту строку ниже в разделе [mysqld]
default-time-zone = '+00: 00'
Затем перезагрузите mysql. Теперь выберите curtime(); показывает время по Гринвичу.
Ответ 4
Если изменение часового пояса на ваших рабочих серверах или обновление настроек конфигурации ключа и перезапуск mysql кажется нереалистичным и/или чрезмерным, попробуйте следующее:
CONVERT_TZ(NOW(), 'US/Pacific', 'UTC')
Где US/Pacific
- это часовой пояс, ваш вызов NOW()
возвращает время.
Ответ 5
Правильный способ сделать это - изменить часовой пояс вашего сервера на UTC, как сказал MarkR.
Однако также можно использовать SET time_zone, чтобы изменить часовой пояс для текущего сеанса.
Из руководства:
Текущая настройка часового пояса влияет на отображение и сохранение значений времени, чувствительных к зоне. Сюда входят значения, отображаемые такими функциями, как NOW() или CURTIME()
Ответ 6
Вам нужно будет использовать оператор SET TIMESTAMP для форматирования результатов datetime в нужном формате. Это будет означать изменение всех этих запросов. sysdate() не будет соблюдать это, хотя.
Ответ 7
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