Postgres Standardzeitzone

99

Ich habe installiert PostgreSQL 9und die angezeigte Zeit liegt 1 Stunde hinter der Serverzeit.

Laufende Select NOW()Shows:2011-07-12 11:51:50.453842+00

Das Serverdatum zeigt: Tue Jul 12 12:51:40 BST 2011

Es ist 1 Stunde zurück, aber die in gezeigte Zeitzone phppgadminist:TimeZone Etc/GMT0

Ich habe versucht, in die postgresql.confund Einstellung zu gehen

Zeitzone = GMT

dann einen Neustart ausführen, aber keine Änderung.

Irgendwelche Ideen, von denen ich dachte, dass sie nur die Server-Zeitzone verwendet hätten, aber offensichtlich nicht?!

LÖSUNG!: Ich habe es GMTvorher eingestellt und es war eine Stunde später. Nach dem Durchsuchen stellte sich heraus, dass ich es einstellen musste Europe/London. Dies berücksichtigt die +1 Stunde im britischen Sommer, GMT nicht!

Blu Towers
quelle

Antworten:

113

Die Zeitzone ist ein Sitzungsparameter. Sie können also die Zeitzone für die aktuelle Sitzung ändern.

Siehe das Dokument .

set timezone TO 'GMT';

Oder verwenden Sie den SET TIME ZONEBefehl , um dem SQL-Standard genauer zu folgen . Beachten Sie zwei Wörter für "ZEITZONE", wobei der obige Code ein einzelnes Wort "Zeitzone" verwendet.

SET TIME ZONE 'UTC';

Der Arzt erklärt den Unterschied:

SET TIME ZONE erweitert die im SQL-Standard definierte Syntax. Der Standard erlaubt nur numerische Zeitzonenversätze, während PostgreSQL flexiblere Zeitzonenspezifikationen zulässt. Alle anderen SET-Funktionen sind PostgreSQL-Erweiterungen.

Muhammad Usama
quelle
2
Ich habe versucht, das einzustellen, und es schien nicht zu funktionieren, auch nicht, dass es nur für die aktive Sitzung eingestellt wurde. Ich möchte es dauerhaft für alle Datenbanken ändern ect, ich habe dies leicht in phpmyadmin gemacht, aber ich kann keinen Weg finden, es für postgresql
Blu Towers
yup 'set timezone To ..' legt nur die Zeitzone für die aktuelle Sitzung fest. Wenn Sie den Zeitzonen-Konfigurationsparameter in Postgresql.conf ändern, sollte die Zeitzone für alle Datenbanken geändert werden.
Muhammad Usama
4
Ich habe versucht, die Zeitzone in postgresql.conf auf GMT zu ändern, und es scheint gut zu funktionieren.
Muhammad Usama
Standard (SQL-konform) sind zwei Wörter für "TIME ZONE" : SET TIME ZONE 'UTC';. Siehe das Dokument .
Basil Bourque
102

Wählen Sie eine timezoneaus:

SELECT * FROM pg_timezone_names;

Und setwie unten angegebenes Beispiel:

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

Verwenden Sie Ihren DB-Namen anstelle der postgresobigen Anweisung.

Iurii Perevertailo
quelle
4
Sie müssen den Postgresql-Dienst neu starten, nachdem dies erledigt ist
Joey Pinto
24
@JoeyPinto nicht wahr, es ist genug, um SELECT pg_reload_conf();
auszugeben
4
Ich lief die Erklärung mit meinen Datenbanknamen und SELECT pg_reload_conf()kehrte wahr, aber now()und select current_setting('TIMEZONE')weiterhin Werte zurück für ‚America / New_York‘. Liegt es daran, dass ich kein Superuser bin?
Noumenon
48

Um die Zeitzonenänderung in Postgres 9.1 durchzuführen, müssen Sie:

1.- Suchen Sie in Ihrem Ordner "timezones" in /usr/share/postgresql/9.1/ nach der entsprechenden Datei. In meinem Fall wäre dies "America.txt". Suchen Sie darin nach dem nächstgelegenen Speicherort für Ihre Zone und kopieren Sie den Ordner Anfangsbuchstaben in der linken Spalte.

Zum Beispiel: Wenn Sie in "New York" oder "Panama" sind, wäre es "EST":

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

2.- Kommentieren Sie die Zeile "Zeitzone" in Ihrer postgresql.confDatei aus und geben Sie Ihre Zeitzone wie folgt ein :

#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.- Starten Sie Postgres neu

Guerrerocarlos
quelle
3
Dies ist eigentlich die richtige Antwort, da dadurch die TZ-Änderung für jeden Prozess in PGSQL geändert wird, nicht nur für den aktuellen Benutzer.
jfreak53
15
Ich schlage vor, Sie vermeiden diese 3 oder 4 Buchstaben Codes insgesamt. Sie sind weder standardisiert noch einzigartig. Verwenden Sie stattdessen die richtigen Zeitzonennamen (Kontinent SLASH Stadt oder Region). Um Ihr eigenes Beispiel zu verwenden, verwendet Panama einen −05:00ganzjährigen Versatz, während New York eine Stunde mit Sommerzeit (DST) verschiebt. Eine Zeitzone ist mehr als ein Versatz. Eine Zeitzone umfasst die vergangenen, gegenwärtigen und zukünftigen Regeln und Anomalien wie die Sommerzeit. Also, sagen , was Sie meinen: America/Panama, America/New_York, Europe/London, UTC(oder Zulu).
Basil Bourque
3
Gemäß den PostGRE-Dokumenten können Sie in einer internen Ansicht eine Liste der erkannten Zeitzonennamen in Ihrer spezifischen Datenbank abrufen , SELECT * FROM pg_timezone_nameswas wahrscheinlich sicherer ist, da Websites von Drittanbietern nicht unbedingt so aktuell sind (oder veraltet) als Ihre eigene Datenbankinstanz.
Selten needy
Ich habe diesen Ordner nicht in der Freigabepostgresql
SuperUberDuper
Anstatt PostgreSQL neu zu starten, können Sie ausführen select pg_reload_conf().
ANeves
42

Die akzeptierte Antwort von Muhammad Usama ist richtig.

Name des Konfigurationsparameters

Diese Antwort zeigt, wie ein Postgres-spezifischer Konfigurationsparameter wie folgt festgelegt wird:

SET timezone TO 'UTC';

… Wo timezonees sich nicht um einen SQL-Befehl handelt, ist dies der Name des Konfigurationsparameters.

Siehe dazu das Dokument .

Standard SQL Befehl

Alternativ können Sie den SQL-Befehl verwenden, der durch die SQL-Spezifikation definiert ist : SET TIME ZONE. In dieser Syntax TIME ZONEersetzen zwei Wörter "Zeitzone" (tatsächlicher SQL-Befehl versus Parametername), und es gibt kein "TO".

SET TIME ZONE 'UTC';

Sowohl dieser als auch der obige Befehl haben den gleichen Effekt, um den Wert nur für die aktuelle Sitzung festzulegen. Um die Änderung dauerhaft zu machen, lesen Sie diese Antwort der Geschwister .

Siehe dazu das Dokument .

Name der Zeitzone

Sie können einen geeigneten Zeitzonennamen angeben . Die meisten davon sind Kontinente / Regionen.

SET TIME ZONE 'Africa/Casablanca';

…oder…

SET TIME ZONE 'America/Montreal';

Vermeiden Sie die 3 oder 4 Buchstaben Abkürzungen wie ESToder ISTwie sie weder standardisiert noch einzigartig. In Wikipedia finden Sie eine Liste der Zeitzonennamen .

Aktuelle Zone abrufen

Versuchen Sie eine der folgenden Anweisungen, um die aktuelle Zeitzone für eine Sitzung anzuzeigen. Technisch rufen wir den SHOWBefehl auf, um einen Laufzeitparameter anzuzeigen.

SHOW timezone ;

…oder…

SHOW time zone ;

USA / Pazifik

Basil Bourque
quelle
4
Bonuspunkt für die einzige Antwort, die das SHOWTeil liefert
Ariel Allon
Roger das, Ariel Allon - und für den nächsten Mann, der diese Zeitzone in eine Variable wählen möchte ...SELECT current_setting('TIMEZONE')
Wellspring
10

Wenn Sie das Tool pgAdmin III verwenden , können Sie zusätzlich zu den vorherigen Antworten die Zeitzone wie folgt einstellen:

  1. Öffnen Sie die Postgres-Konfiguration über Extras> Serverkonfiguration> postgresql.conf
  2. Suchen Sie den Eintrag Zeitzone und klicken Sie doppelt auf offen
  3. Ändern Sie den Wert
  4. Laden Sie den Server neu, um Konfigurationsänderungen zu übernehmen (Wiedergabetaste oben oder über Dienste).

Postgres-Konfiguration in pgAdmin III

Pascal
quelle
3

Beachten Sie, dass viele Clients von Drittanbietern eigene Zeitzoneneinstellungen haben, die sich mit allen Postgres-Server- und / oder Sitzungseinstellungen überschneiden.

Wenn Sie beispielsweise 'IntelliJ IDEA 2017.3' (oder DataGrips) verwenden, sollten Sie die Zeitzone wie folgt definieren:

'DB-Quelleneigenschaften' -> Registerkarte 'Erweitert' -> 'VM-Optionen': -Duser.timezone = UTC + 06: 00

Andernfalls wird "UTC" angezeigt, obwohl Sie irgendwo anders eingestellt haben.

ARA1307
quelle
Muss dies also mit den Änderungen der Sommer- / Winterzeit synchronisiert werden?
Cpt. Senkfuss
1
@ Cpt.Senkfuss, ich glaube so etwas wie -Duser.timezone = Australien / Tasmanien sollte auch funktionieren und sich um Sommer- / Winterveränderungen kümmern.
ARA1307
Dies ist ein Lebensretter-Trick. Ich habe versucht zu verstehen, was falsch ist, kann jetzt für 3 Stunden sein :) Übrigens, habe den vollständigen Zeitzonennamen ausprobiert und es funktioniert. Für mich ist es -Duser.timezone = Europa / Istanbul
Olgun Kaya
0

Vielleicht nicht mit der Frage verbunden, aber ich musste CST verwenden, die Systemzeitzone auf das gewünschte tz (Amerika / ...) einstellen und dann in postgresql conf den Wert der Zeitzone auf 'localtime' setzen und es funktionierte als Zauber , current_time druckt zum richtigen Zeitpunkt (Postgresql 9.5 unter Ubuntu 16)

MGrillo
quelle