postgres domyślna strefa czasowa

99

Zainstalowałem PostgreSQL 9i wyświetlany czas jest 1 godzinę za czasem serwera.

Select NOW()Pokazy biegowe :2011-07-12 11:51:50.453842+00

Data serwera pokazuje: Tue Jul 12 12:51:40 BST 2011

Jest 1 godzina wstecz, ale strefa czasowa pokazana w phppgadminto:TimeZone Etc/GMT0

Próbowałem wejść do postgresql.confustawienia i

strefa czasowa = GMT

a następnie ponowne uruchomienie, ale bez zmian.

Jakieś pomysły, o których myślałem, że użyłby tylko strefy czasowej serwera, ale oczywiście nie ?!

ROZWIĄZANIE !: Ustawiłem się GMTwcześniej i minęła godzina. po przeszukaniu okazuje się, że musiałem to ustawić Europe/London. Uwzględnia to +1 godzinę brytyjskiego czasu letniego, GMT nie!

Blu Towers
źródło

Odpowiedzi:

113

Strefa czasowa to parametr sesji. Możesz więc zmienić strefę czasową dla bieżącej sesji.

Zobacz doc .

set timezone TO 'GMT';

Lub, dokładniej przestrzegając standardu SQL, użyj SET TIME ZONEpolecenia. Zwróć uwagę na dwa słowa dla „STREFA CZASU”, w których powyższy kod używa jednego słowa „strefa czasowa”.

SET TIME ZONE 'UTC';

Dokument wyjaśnia różnicę:

SET TIME ZONE rozszerza składnię zdefiniowaną w standardzie SQL. Standard dopuszcza tylko numeryczne przesunięcia stref czasowych, podczas gdy PostgreSQL umożliwia bardziej elastyczne specyfikacje stref czasowych. Wszystkie inne funkcje SET są rozszerzeniami PostgreSQL.

Muhammad Usama
źródło
2
Próbowałem to ustawić i wydawało się, że nie działa, również nie działa, że ​​ustawia to tylko dla aktywnej sesji. Chciałbym to zmienić na stałe dla wszystkich baz danych itd. Zrobiłem to łatwo w phpmyadmin, ale nie mogę znaleźć sposobu, aby to zrobić dla postgresql
Blu Towers
yup 'set timezone To ..' ustawia strefę czasową tylko dla bieżącej sesji, a jeśli zmienisz parametr konfiguracyjny strefy czasowej w Postgresql.conf, powinna to zmienić strefę czasową dla wszystkich baz danych.
Muhammad Usama,
4
Próbowałem zmienić strefę czasową na GMT w postgresql.conf i wydaje się, że działa dobrze.
Muhammad Usama,
Bardziej standardowe (zgodny z SQL SPEC) to dwa słowa dla "Time Zone": SET TIME ZONE 'UTC';. Zobacz doc .
Basil Bourque
103

Wybierz timezonespośród:

SELECT * FROM pg_timezone_names;

I setjak poniżej podany przykład:

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

Użyj swojej nazwy DB zamiast postgresw powyższej instrukcji.

Iurii Perevertailo
źródło
4
Po wykonaniu tej czynności musisz ponownie uruchomić usługę postgresql
Joey Pinto
24
@JoeyPinto nieprawda, wystarczy wystawić SELECT pg_reload_conf();:)
Alphaaa
4
Uruchomiłem instrukcję z nazwą mojej bazy danych i zwróciłem SELECT pg_reload_conf()prawdę, ale now()i select current_setting('TIMEZONE')nadal zwracam wartości dla „America / New_York”. Czy to dlatego, że nie jestem superużytkownikiem?
Noumenon
48

Aby zakończyć zmianę strefy czasowej w Postgres 9.1, musisz:

1.- Wyszukaj w folderze „timezones” w /usr/share/postgresql/9.1/ odpowiedni plik, w moim przypadku będzie to „America.txt”, w nim wyszukaj lokalizację najbliższą Twojej strefy i skopiuj pierwsze litery w lewej kolumnie.

Na przykład: jeśli jesteś w „Nowym Jorku” lub „Panamie”, będzie to „EST”:

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

2. - Usuń komentarz z linii „strefa czasowa” w postgresql.confpliku i ustaw strefę czasową, jak pokazano:

#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. - Uruchom ponownie Postgres

guerrerocarlos
źródło
3
To jest właściwie prawidłowa odpowiedź, ponieważ powoduje, że zmiana TZ jest domyślna dla każdego procesu w PGSQL, a nie tylko dla bieżącego użytkownika.
jfreak53
15
Proponuję całkowicie unikać tych 3 lub 4-literowych kodów . Nie są ani znormalizowane, ani unikalne. Zamiast tego użyj odpowiednich nazw stref czasowych (kontynent SLASH miasto-region). Aby posłużyć się własnym przykładem, Panama stosuje przesunięcie w ciągu całego −05:00roku, podczas gdy Nowy Jork przesuwa o godzinę z czasem letnim (DST). Strefa czasowa to coś więcej niż przesunięcie; strefa czasowa obejmuje przeszły, obecny i przyszły zestaw reguł i anomalii, takich jak czas letni. Tak więc, powiedzieć, co masz na myśli: America/Panama, America/New_York, Europe/London, UTC(albo Zulu).
Basil Bourque
3
Zgodnie z dokumentacją PostGRE możesz sprawdzić widok wewnętrzny, aby uzyskać listę rozpoznawanych nazw stref czasowych w określonej bazie danych, robiąc SELECT * FROM pg_timezone_namesto, co prawdopodobnie jest bezpieczniejsze, biorąc pod uwagę, że witryny innych firm niekoniecznie będą tak aktualne (lub nieaktualne) jako Twoja własna instancja bazy danych.
RzadkoNeedy
Nie mam tego folderu w udostępnieniupostgresql
SuperUberDuper
Zamiast restartować PostgreSQL, możesz uruchomić select pg_reload_conf().
ANeves,
42

Akceptowane odpowiedź przez Muhammada Osamą jest poprawna.

Nazwa parametru konfiguracji

Ta odpowiedź pokazuje, jak ustawić parametr konfiguracyjny specyficzny dla Postgres z następującymi elementami:

SET timezone TO 'UTC';

… Gdzie timezonenie jest poleceniem SQL, jest to nazwa parametru konfiguracyjnego.

Zobacz dokument na ten temat .

Standardowe polecenie SQL

Alternatywnie, można użyć polecenia SQL zdefiniowanego przez spec SQL: SET TIME ZONE. W tej składni para słów TIME ZONEzastępuje „strefa czasowa” (rzeczywista komenda SQL kontra nazwa parametru) i nie ma słowa „TO”.

SET TIME ZONE 'UTC';

Zarówno to polecenie, jak i powyższe mają ten sam efekt, ustawiając wartość tylko dla bieżącej sesji. Aby zmiana była trwała, zobacz odpowiedź dla rodzeństwa .

Zobacz dokument na ten temat .

Nazwa strefy czasowej

Możesz podać odpowiednią nazwę strefy czasowej . Większość z nich to kontynent / region.

SET TIME ZONE 'Africa/Casablanca';

…lub…

SET TIME ZONE 'America/Montreal';

Unikaj 3 lub 4-literowych skrótów, takich jak ESTlub, ISTponieważ nie są one ani znormalizowane, ani unikalne. Zobacz Wikipedię, aby zobaczyć listę nazw stref czasowych .

Pobierz aktualną strefę

Aby zobaczyć bieżącą strefę czasową dla sesji, wypróbuj jedną z poniższych instrukcji. Z technicznego punktu widzenia wywołujemy SHOWpolecenie, aby wyświetlić parametr czasu wykonywania.

SHOW timezone ;

…lub…

SHOW time zone ;

Stany Zjednoczone / Pacyfik

Basil Bourque
źródło
4
dodatkowy punkt za bycie jedyną odpowiedzią, która zapewniła SHOWrolę
Ariel Allon
Zrozum, Ariel Allon - i dla następnego gościa, który chce ustawić tę strefę czasową jako zmienną ...SELECT current_setting('TIMEZONE')
Wellspring
10

Oprócz poprzednich odpowiedzi, jeśli używasz narzędzia pgAdmin III , możesz ustawić strefę czasową w następujący sposób:

  1. Otwórz konfigurację Postgres poprzez Narzędzia> Konfiguracja serwera> postgresql.conf
  2. Poszukaj strefy czasowej wejścia i kliknij dwukrotnie, aby otworzyć
  3. Zmień wartość
  4. Załaduj ponownie serwer, aby zastosować zmiany w konfiguracji (przycisk Odtwórz na górze lub za pośrednictwem usług)

Konfiguracja Postgres w pgAdmin III

Pascal
źródło
3

Należy zauważyć, że wielu klientów innych firm ma własne ustawienia strefy czasowej, które nakładają się na dowolny serwer Postgres i \ lub ustawienia sesji.

Np. Jeśli używasz „IntelliJ IDEA 2017.3” (lub DataGrips), powinieneś zdefiniować strefę czasową jako:

„Właściwości źródła bazy danych” -> karta „Zaawansowane” -> „Opcje maszyny wirtualnej”: -Duser.timezone = UTC + 06: 00

w przeciwnym razie zobaczysz „UTC” niezależnie od tego, co ustawiłeś gdziekolwiek indziej.

ARA1307
źródło
więc musi to być zsynchronizowane ze zmianami czasu letniego / zimowego?
kpt. Senkfuss
1
@ Cpt.Senkfuss, uważam, że coś takiego jak -Duser.timezone = Australia / Tasmania powinno również działać i dbać o zmiany latem / zimą.
ARA1307
To sztuczka ratująca życie. Próbowałem zrozumieć, co może być nie tak już od 3 godzin :) przy okazji, wypróbowałem pełną nazwę strefy czasowej i działa. dla mnie to -Duser.timezone = Europa / Stambuł
Olgun Kaya
0

Może nie ma to związku z pytaniem, ale musiałem użyć CST, ustawić strefę czasową systemu na żądane tz (America / ...) a następnie w postgresql conf ustawić wartość strefy czasowej na 'localtime' i zadziałało jak urok , current_time drukuje właściwy czas (Postgresql 9.5 na Ubuntu 16)

MGrillo
źródło