часовий пояс за замовчуванням


99

Я встановив, 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 - ні!

Відповіді:


113

Часовий пояс - це параметр сеансу. Отже, ви можете змінити часовий пояс для поточного сеансу.

Дивіться док .

set timezone TO 'GMT';

Або, більш уважно слідуючи стандарту SQL, використовуйте SET TIME ZONEкоманду. Зауважте два слова для "ЧАС ЗОНА", де в наведеному вище коді використовується одне слово "часовий пояс".

SET TIME ZONE 'UTC';

Документ пояснює різницю:

SET TIME ZONE розширює синтаксис, визначений у стандарті SQL. Стандарт дозволяє лише числові зрушення часового поясу, тоді як PostgreSQL дозволяє більш гнучкі технічні характеристики часового поясу. Усі інші функції SET - це розширення PostgreSQL.


2
Я спробував налаштувати це, і це, здається, не працює, також не встановив його лише для активного сеансу. Я хочу постійно змінити його для всіх баз даних ECT, я це легко зробив у phpmyadmin, але не можу знайти спосіб зробити це для postgresql
Blu Towers

yup 'встановити часовий пояс To ..' встановлює лише часовий пояс для поточного сеансу, і якщо ви зміните параметр конфігурації часового поясу в Postgresql.conf, він повинен змінити часовий пояс для всіх баз даних.
Мухаммад Усама

4
Я спробував, змінивши часовий пояс на GMT в postgresql.conf, і, здається, це працює нормально.
Мухаммад Усама

Більш стандарт (SQL задовольняє специфікації) складається з двох слів для «TIME ZONE»: SET TIME ZONE 'UTC';. Дивіться док .
Василь Бурк

102

Виберіть один timezoneіз:

SELECT * FROM pg_timezone_names;

А setяк наведено нижче:

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

Використовуйте своє ім'я БД замість postgresвищезгаданого оператора.


4
Вам потрібно перезапустити послугу postgresql після цього
Joey Pinto

24
@JoeyPinto неправда, досить випустити SELECT pg_reload_conf();:)
Alphaaa

4
Я побіг заяву з моїм ім'ям бази даних і SELECT pg_reload_conf()повернувся вірно, але now()і select current_setting('TIMEZONE')продовжую повертати значення для «Америки / New_York». Це тому, що я не надрукований?
Ноумен

48

Щоб домогтися зміни часового поясу в 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
Я пропоную вам взагалі уникати цих 3 або 4 буквених кодів . Вони не є ні стандартизованими, ні унікальними. Натомість використовуйте належні назви часових поясів (місто або регіон континенту SLASH). Щоб використати власний приклад, Панама використовує компенсування цілого −05:00року, а Нью-Йорк змінює годину на літній час (DST). Часовий пояс є більш ніж компенсованим; часовий пояс включає минулий, теперішній та майбутній набір правил і аномалій, таких як DST. Так, кажуть , що ви маєте в виду: America/Panama, America/New_York, Europe/London, UTC(або Zulu).
Василь Бурк

3
Відповідно до документів PostGRE , ви можете перевірити внутрішній вигляд, щоб отримати список розпізнаних імен часового поясу у вашій конкретній базі даних, зробивши це, SELECT * FROM pg_timezone_namesщо, ймовірно, безпечніше, оскільки дані сторонніх сайтів не обов'язково будуть актуальними. (або застарілий) як ваш власний конкретний екземпляр бази даних.
SeldomNeedy

У мене немає такої папки в розділіpostgresql
SuperUberDuper

Замість перезавантаження PostgreSQL можна запустити select pg_reload_conf().
ANeves

42

Загальноприйнятий відповідь на Мухаммада 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';

Уникайте абревіатур з 3 або 4 літер, таких як 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), слід визначити часовий пояс як:

'Властивості джерела БД' -> вкладка 'Додатково' -> 'Параметри VM': -Duser.timezone = UTC + 06: 00

інакше ви побачите "UTC", незважаючи на те, що ви встановили деінде.


тож це потрібно тримати синхронно із змінами літнього / зимового часу?
Cpt. Senkfuss

1
@ Cpt.Senkfuss, я вважаю, що-то на кшталт -Duser.timezone = Австралія / Тасманія також повинна працювати і піклуватися про літні \ зимові зміни.
ARA1307

Це витівка, яка рятує життя. Я намагаюся зрозуміти, що не так, може бути вже 3 години :) btw, спробував повну назву часового поясу, і це працює. для мене це -Duser.timezone = Європа / Стамбул
Olgun Kaya

0

Можливо, це не стосується питання, але мені потрібно було використовувати CST, встановити часовий пояс системи на потрібний tz (America / ...), а потім у postgresql conf встановити значення часового поясу на 'localtime', і воно спрацювало як шарм , поточний час друку правильний час (Postgresql 9.5 в Ubuntu 16)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.