часовой пояс postgres по умолчанию

100

Я установил, PostgreSQL 9и время, которое он показывает, на 1 час отстает от времени сервера.

Бег Select NOW() шоу:2011-07-12 11:51:50.453842+00

Дата сервера показывает: Tue Jul 12 12:51:40 BST 2011

Это на 1 час меньше, но часовой пояс показан в phppgadmin :TimeZone Etc/GMT0

Я пытался войти в postgresql.conf и установить

часовой пояс = GMT

затем выполняется перезагрузка, но без изменений.

Любые идеи, которые я думал, это просто использовал часовой пояс сервера, но, очевидно, нет ?!

РЕШЕНИЕ !: Я поставил GMTраньше, а это было на час позже. после поисков выяснилось, что мне нужно было его установить Europe/London. Это учитывает +1 час летнего британского времени, а GMT - нет!

Blu Towers
источник
Прежде чем вносить какие-либо изменения, всегда полезно проверить текущее значение часового пояса. Советы здесь: stackoverflow.com/a/28218103/625840
Хартли Броуди,

Ответы:

116

Часовой пояс - это параметр сеанса. Итак, вы можете изменить часовой пояс для текущего сеанса.

См. Док .

set timezone TO 'GMT';

Или, более точно следуя стандарту SQL, используйте SET TIME ZONEкоманду. Обратите внимание на два слова для «ЧАСОВОГО ПОЯСА», где в приведенном выше коде используется одно слово «часовой пояс».

SET TIME ZONE 'UTC';

Документ объясняет разницу:

SET TIME ZONE расширяет синтаксис, определенный в стандарте SQL. Стандарт допускает только числовые смещения часовых поясов, в то время как PostgreSQL допускает более гибкие спецификации часовых поясов. Все остальные функции SET являются расширениями PostgreSQL.

Мухаммад Усама
источник
2
Я попытался установить это, и это, похоже, не сработало, также это не только для активного сеанса. Я хочу изменить его навсегда для всех баз данных и т. Д., Я легко сделал это в phpmyadmin, но, похоже, не могу найти способ сделать это для postgresql
Blu Towers
yup 'set timezone To ..' устанавливает только часовой пояс для текущего сеанса, и если вы измените параметр конфигурации часового пояса в Postgresql.conf, он должен изменить часовой пояс для всех баз данных.
Мухаммад Усама
5
Я попытался изменить часовой пояс на GMT в postgresql.conf, и, похоже, он работает нормально.
Мухаммад Усама
Более стандарт (SQL удовлетворяет спецификации) состоит из двух слов для «TIME ZONE»: SET TIME ZONE 'UTC';. См. Док .
Basil Bourque
105

Выберите timezoneиз:

SELECT * FROM pg_timezone_names;

И setкак показано ниже в примере:

ALTER DATABASE postgres SET timezone TO 'Europe/Berlin';

Используйте имя своей БД вместо postgresприведенного выше утверждения.

Юрий Перевертайло
источник
5
После этого вам нужно перезапустить службу postgresql,
Джои Пинто,
25
@JoeyPinto неправда, достаточно выдать SELECT pg_reload_conf();:)
Alphaaa
4
Я побежал заявление с моим именем базы данных и SELECT pg_reload_conf()вернулся верно, но now()и select current_setting('TIMEZONE')продолжаю возвращать значения для «Америки / New_York». Это потому, что я не суперпользователь?
Ноумен
@JoeyPinto спасибо за предложение, я попробовал с помощью SELECT pg_reload_conf (), и он также вернул true, но он не показал обновленный часовой пояс, после перезапуска службы postgres он отражал новый часовой пояс.
Prem popatia
49

Чтобы выполнить изменение часового пояса в Postgres 9.1, вы должны:

1. - Найдите в папке «timezones» в /usr/share/postgresql/9.1/ подходящий файл, в моем случае это будет «America.txt», найдите в нем ближайшее к вашей зоне место и скопируйте первые буквы в левом столбце.

Например: если вы находитесь в «Нью-Йорке» или «Панаме», это будет «EST»:

#  - EST: Eastern Standard Time (Australia)
EST    -18000    # Eastern Standard Time (America)
                 #     (America/New_York)
                 #     (America/Panama)

2.- Раскомментируйте строку «часовой пояс» в своем postgresql.confфайле и укажите часовой пояс, как показано:

#intervalstyle = 'postgres'
#timezone = '(defaults to server environment setting)'
timezone = 'EST'
#timezone_abbreviations = 'EST'     # Select the set of available time zone
                                        # abbreviations.  Currently, there are
                                        #   Default
                                        #   Australia

3.- Перезапустите Postgres

Геррерокарлос
источник
3
На самом деле это правильный ответ, так как он делает изменение TZ по умолчанию для каждого процесса в PGSQL, а не только для текущего пользователя.
jfreak53
15
Я предлагаю вам вообще избегать использования этих трех- или четырехбуквенных кодов . Они не стандартизированы и не уникальны. Вместо этого используйте правильные названия часовых поясов (континент SLASH city-or-region). Чтобы использовать ваш собственный пример, Панама использует смещение −05:00круглый год, в то время как Нью-Йорк сдвигает час с переходом на летнее время (DST). Часовой пояс - это больше, чем смещение; часовой пояс включает прошлый, настоящий и будущий набор правил и аномалий, таких как летнее время. Так, говорят , что вы имеете в виду: America/Panama, America/New_York, Europe/London, UTC(или Zulu).
Basil Bourque
3
В соответствии с документами PostGRE вы можете проверить внутреннее представление, чтобы получить список распознанных имен часовых поясов в вашей конкретной базе данных, сделав, SELECT * FROM pg_timezone_namesчто, вероятно, безопаснее, учитывая, что сторонние сайты не обязательно будут такими же актуальными. (или устаревший) как ваш собственный экземпляр базы данных.
SeldomNeedy
У меня нет этой папки в общем postgresql
доступе
Вместо перезапуска PostgreSQL можно запустить select pg_reload_conf().
Аневс считает SE злом
43

Общепринятый ответ на Мухаммада Usama правильно.

Имя параметра конфигурации

Этот ответ показывает, как установить параметр конфигурации, специфичный для Postgres, следующим образом:

SET timezone TO 'UTC';

…где timezone это не команда SQL, это имя параметра конфигурации.

См. Документ для этого .

Стандартная команда SQL

Кроме того , вы можете использовать команду SQL , определенный SQL спецификации: SET TIME ZONE. В этом синтаксисе пара слов TIME ZONEзаменяет «часовой пояс» (фактическая команда SQL вместо имени параметра), и нет «TO».

SET TIME ZONE 'UTC';

И эта команда, и команда выше имеют одинаковый эффект, устанавливая значение только для текущего сеанса. Чтобы сделать изменение постоянным, см. Этот ответ родного брата .

См. Документ для этого .

Название часового пояса

Вы можете указать правильное имя часового пояса . Большинство из них - континент / регион.

SET TIME ZONE 'Africa/Casablanca';

…или…

SET TIME ZONE 'America/Montreal';

Избегайте трех- или четырехбуквенных сокращений, таких как ESTили, ISTпоскольку они не являются ни стандартизированными, ни уникальными. См. Список названий часовых поясов в Википедии .

Получить текущую зону

Чтобы увидеть текущий часовой пояс сеанса, попробуйте одно из следующих утверждений. Технически мы вызываем SHOWкоманду для отображения параметра времени выполнения.

SHOW timezone ;

…или…

SHOW time zone ;

США / Тихоокеанский регион

Василий Бурк
источник
4
бонусный балл за то, что был единственным ответом, предоставившим SHOWдеталь
Ариэль Аллон
Роджер, Ариэль Аллон - и для следующего парня, который захочет выбрать этот часовой пояс в переменной ...SELECT current_setting('TIMEZONE')
Wellspring,
10

В дополнение к предыдущим ответам, если вы используете инструмент pgAdmin III, вы можете установить часовой пояс следующим образом:

  1. Откройте конфигурацию Postgres через Инструменты> Конфигурация сервера> postgresql.conf
  2. Найдите часовой пояс входа и дважды щелкните, чтобы открыть
  3. Измените значение
  4. Перезагрузите сервер, чтобы применить изменения конфигурации (кнопка воспроизведения вверху или через службы)

Конфигурация Postgres в pgAdmin III

Паскаль
источник
3

Обратите внимание, что многие сторонние клиенты имеют собственные настройки часового пояса, перекрывающие любые настройки сервера Postgres и \ или сеанса.

Например, если вы используете IntelliJ IDEA 2017.3 (или DataGrips), вы должны определить часовой пояс как:

«Свойства источника БД» -> вкладка «Дополнительно» -> «Параметры ВМ»: -Duser.timezone = UTC + 06: 00

в противном случае вы увидите «UTC» независимо от того, что вы установили где-либо еще.

ARA1307
источник
так что это нужно синхронизировать с переходом на летнее / зимнее время?
Капитан. Senkfuss
1
@ Cpt.Senkfuss, я считаю, что что-то вроде -Duser.timezone = Australia / Tasmania также должно работать и позаботиться о летних / зимних изменениях.
ARA1307
Это уловка, спасающая жизнь. Я пытался понять, что не так, может быть, уже 3 часа :) кстати, попробовал полное имя часового пояса, и он работает. для меня это -Duser.timezone = Europe / Istanbul
Olgun Kaya
0

Возможно, это не связано с вопросом, но мне нужно было использовать CST, установить системный часовой пояс на желаемый tz (Америка / ...), а затем в postgresql conf установить значение часового пояса на 'localtime', и это сработало как шарм , current_time печатает правильное время (Postgresql 9.5 в Ubuntu 16)

MGrillo
источник