24 окт. 2019 г.

PostgreSQL и часовой пояс


    Заметил, что у меня в базе данных на PostgreSQL, все поля, которые заполняются по умолчанию текущим временем (DEFAULT LOCALTIMESTAMP), отстают от реального времени на 10 часов. В 19:45 запрос
select localtimestamp, current_timestamp
вернул
"11.10.2019 9:45:56" "2019-10-11 09:45:56.884309-07"
Проверил время на сервере – оно правильное. Значит дело в настройках СУБД. Так как PostgreSQL я увидел первый раз совсем недавно, то пришлось заглянуть в документацию. Оказалось, что проблема в ненастроенном параметре "timezone", который задает часовой пояс для вывода и ввода значений времени.
    Посмотреть значение параметра "timezone" для текущей сессии можно выполнив команду:
SHOW timezone
Выполнив ее, я убедился, что часовой пояс у меня стоит по умолчанию – "US/Pacific". Получается, что админ после установки сервера не настроил параметр "timezone" и моя задача исправить эту оплошность.
    Для начала выберем интересующий меня часовой пояс. Список часовых поясов можно посмотреть с помощью SQL запроса:
SELECT * FROM pg_timezone_names;
Мне для Минска подошел часовой пояс "Europe/Minsk". Его я и буду указывать ниже в примерах (вы замените на свой часовой пояс, например на "Europe/Moscow"). Хотя, как потом оказалось, по поводу имени часового пояса можно не заморачиваться. Этот параметр "всеядный" и вместо "Europe/Minsk" можно писать "+3", "UTC-3", "EEST-3"...

Существует три варианта настройки часового пояса:

1. Для текущей сессии. Делается с помощью SQL-команды "SET TIME ZONE" или "SET TIMEZONE TO". Например:
SET TIME ZONE 'Europe/Minsk'
или
SET TIMEZONE TO 'Europe/Minsk'
2. Для конкретной базы данных. Делается с помощью SQL-команды "ALTER DATABASE". Например:
ALTER DATABASE db_name SET timezone TO 'Europe/Minsk'
где "db_name" – это имя базы данных. Что бы ощутить результат выполнения этой команды, необходимо переподключиться к базе данных.

3. Для всего сервера. Делается двумя способами:
  1-й. вручную задать параметр "timezone = 'Europe/Minsk'" в файле postgresql.conf
  2-й. с помощью SQL-команды "ALTER SYSTEM" записать значение параметра в файл postgresql.auto.conf (он считывается сервером после postgresql.conf, поэтому имеет приоритет). Например:
ALTER SYSTEM SET timezone TO 'Europe/Minsk'
Что бы ощутить результат, в обоих случаях необходимо перезапустить службу PostgreSQL.

После настройки часового пояса снова выполним запрос "select localtimestamp, current_timestamp":
"11.10.2019 19:47:19" "2019-10-11 19:47:19.82261+03"
Теперь время корректное.

Комментариев нет: