2015-01-29 13 views
17

Ich möchte den aktuellen Namen der Zeitzone erhalten. Was ich bereits erreicht ist, die UTC_Offset/die Zeitzone Abkürzung über zu bekommen:Wie erhalte ich den Namen der aktuellen Zeitzone in Postgres 9.3?

SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE') 

Das gibt mir alle Kontinent/Kapital Kombinationen für diese Zeitzone aber nicht die genaue Zeitzone. Zum Beispiel bekomme ich:

Der Server ist in Berlin und ich möchte den Zeitzone Namen des Servers zu bekommen

Das Problem, das ich mit CET habe, dass es immer UTC + 01: 00 ist und DST iirc nicht berücksichtigt.

+0

Der richtige Zeitzone Name für Berlin oder Amsterdam ist Mitteleuropäische Zeit (MEZ). Im Allgemeinen sind Zeitzonennamen und Abkürzungen nicht gut definiert; Während es einen ISO-Standard gibt, verwenden viele Länder ihre eigenen Definitionen. Die PostgreSQL-Unterstützung ist ebenfalls nicht vollständig, siehe http://www.postgresql.org/docs/9.4/static/datetime-config-files.html für einige Details. – Patrick

+0

In der Tabelle pg_timezone_names ist CET als Abkürzung und z. B. "Europe/Berlin" als Name definiert. Ich brauche den Namen und nicht die Abkürzung. – Deutro

+0

Der Link, den ich in meinem vorherigen Kommentar angegeben habe, zeigt Ihnen, wie Sie die Dateien bearbeiten können, um das zu liefern, was Sie benötigen. Das ist so gut wie es geht. – Patrick

Antwort

31

Ich denke nicht, dass dies mit PostgreSQL allein im allgemeinsten Fall möglich ist. Wenn Sie PostgreSQL installieren, wählen Sie eine Zeitzone aus. Ich bin mir ziemlich sicher, dass standardmäßig die Zeitzone des Betriebssystems verwendet wird. Dies wird normalerweise in postgresql.conf als Wert des Parameters "timezone" wiedergegeben. Aber der Wert endet als "localtime". Sie können diese Einstellung mit der SQL-Anweisung sehen.

show timezone; 

Aber wenn Sie die Zeitzone in postgresql.conf zu so etwas wie „Europe/Berlin“ ändern, dann wird show timezone; zurückkehren dass Wert statt „Localtime“.

Also denke ich, dass Ihre Lösung "Zeitzone" in postgresql.conf auf einen expliziten Wert statt der Standardzeit "localtime" setzen wird.

+0

Danke für Ihre Antwort. Irgendwie seltsam, dass es nicht möglich ist, die Systems-Zeitzone zu bekommen. – Deutro

+0

Und um die Zeitzone einzustellen, können Sie 'Zeitzone auf 'UTC' setzen. – ivkremer

+0

@ivkremer: 'set timezone' legt die Zeitzone für eine Client-Sitzung fest; Die Zeitzone für den PostgreSQL-Server wird nicht festgelegt. –

7

Dies kann oder kann nicht helfen, Ihr Problem, OP-Adresse, aber die Zeitzone des aktuellen Server relativ zu UTC (UT1, technisch) zu bekommen, tun:

SELECT EXTRACT(TIMEZONE FROM now())/3600.0; 

Die oben genannten Arbeiten durch das Extrahieren UT1-relativer Offset in Minuten und dann Umwandlung in Stunden unter Verwendung des Faktors von 3600 Sekunden/Stunde.

Beispiel:

SET SESSION timezone TO 'Asia/Kabul'; 
SELECT EXTRACT(TIMEZONE FROM now())/3600.0; 
-- output: 4.5 (as of the writing of this post) 

(docs).

+4

Ein anderer Benutzer [http://stackoverflow.com/review/suggested-edits/12763260], der 'SELECT EXTRACT (TIMEZONE_HOUR FROM now()) 'verwendet, ist jedoch leicht gefährlich, da ** die Tatsache ignoriert wird dass es dort ** sowohl Halb- als auch Viertelzeitzonen gibt. @giladMayani – koyae

+2

_ "Nordkorea, Neufundland, Indien, Iran, Afghanistan, Venezuela, Birma, Sri Lanka, die Marquesas, sowie Teile Australiens verwenden halbstündige Abweichungen von der Standardzeit. Einige Nationen, wie Nepal, und einige Provinzen, wie die Chatham-Inseln, verwenden Viertelstunden-Abweichungen. "_ ([link] (https://en.wikipedia.org/wiki/Time_zone#Worldwide_time_zones)) – koyae

3

Siehe diese Antwort: Source

Wenn Zeitzone nicht in postgresql.conf oder als Server-Befehlszeilenoption angegeben ist, versucht der Server den Wert der Umgebungsvariable TZ als Standard-Zeitzone zu verwenden, . Wenn TZ nicht definiert ist oder keiner der Zeitzonennamen in PostgreSQL bekannt ist, versucht der Server, die Standardzeitzone des Betriebssystems zu ermitteln, indem er das Verhalten der C-Bibliotheksfunktion localtime() überprüft. Die Standardzeitzone wird als die beste Übereinstimmung zwischen den bekannten PostgreSQL-Zeitzonen ausgewählt. (Diese Regeln können auch verwendet den Standardwert von log_timezone zu wählen, wenn nicht anders angegeben.) source

Das bedeutet, dass, wenn Sie nicht über eine Zeitzone definieren, der Server versucht, das Betriebssystem des Standardzeitzone, um zu bestimmen, indem geprüft das Verhalten der C-Bibliotheksfunktion localtime().

Wenn Zeitzone nicht in postgresql.conf oder als Server-Befehlszeilenoption angegeben ist, versucht der Server, den Wert der TZ-Umgebungsvariablen als Standardzeitzone zu verwenden.

Es scheint in der Tat die Zeitzone des Systems eingestellt zu sein, ist tatsächlich möglich.

Die lokale Zeitzone des Betriebssystems aus der Shell abrufen. In psql:

=> \! date +%Z 
Verwandte Themen