Как получить текущее имя часового пояса в Postgres 9.3?
Я хочу получить текущее название часового пояса.
Я уже достиг того, чтобы получить utc_offset
/сокращение часового пояса с помощью:
SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE')
Это дает мне все комбинации Континент/Капитал для этого часового пояса, но не точную timezone
. Например я получаю:
Europe/Amsterdam
Europe/Berlin
Сервер находится в Berlin
, и я хочу получить имя часового пояса сервера.
У меня есть проблема с CET
, что он всегда UTC+01:00
и не учитывает DST iirc
.
Ответы
Ответ 1
Я не думаю, что это возможно, используя PostgreSQL в самом общем случае. Когда вы устанавливаете PostgreSQL, вы выбираете часовой пояс. Я почти уверен, что по умолчанию используется часовой пояс операционной системы. Это обычно отражается в postgresql.conf как значение параметра "часовой пояс". Но значение заканчивается как "местное время". Этот параметр можно увидеть с помощью инструкции SQL.
show timezone;
Но если вы измените часовой пояс в postgresql.conf на что-то вроде "Европа/Берлин", то show timezone;
вернет это значение вместо "localtime".
Итак, я думаю, что ваше решение будет включать настройку "часовой пояс" в postgresql.conf для явного значения, а не по умолчанию "localtime".
Ответ 2
Это может или не поможет вам решить вашу проблему, OP, но чтобы получить часовой пояс текущего сервера относительно UTC (UT1, технически), выполните:
SELECT EXTRACT(TIMEZONE FROM now())/3600.0;
Вышеизложенное выполняется путем извлечения UT1-относительного смещения в минутах, а затем преобразования его в часы с использованием коэффициента 3600 сек/час.
Пример:
SET SESSION timezone TO 'Asia/Kabul';
SELECT EXTRACT(TIMEZONE FROM now())/3600.0;
-- output: 4.5 (as of the writing of this post)
(docs).
Ответ 3
Смотрите этот ответ: Источник
Если часовой пояс не указан в postgresql.conf или в качестве параметра командной строки сервера, сервер пытается использовать значение переменной среды TZ в качестве часового пояса по умолчанию. Если TZ не определен или не является ни одним из имен часовых поясов, известных PostgreSQL, сервер пытается определить часовой пояс операционной системы по умолчанию, проверяя поведение функции библиотеки C localtime(). Часовой пояс по умолчанию выбран в качестве наиболее близкого совпадения среди известных часовых поясов PostgreSQL. (Эти правила также используются для выбора значения по умолчанию log_timezone, если не указано.) Source
Это означает, что если вы не определите часовой пояс, сервер попытается определить часовой пояс операционной системы по умолчанию, проверив поведение функции библиотеки C localtime().
Если часовой пояс не указан в postgresql.conf или в качестве параметра командной строки сервера, сервер пытается использовать значение переменной среды TZ в качестве часового пояса по умолчанию.
Кажется, что системный часовой пояс, который можно установить, действительно возможен.
Получить локальный часовой пояс ОС из оболочки. В PSQL:
=> \! date +%Z
Ответ 4
В Postgresql 9.5 все работает нормально:
SELECT current_setting('TIMEZONE');