Verwenden Sie node-postgres, um Postgres "Zeitstempel ohne Zeitzone" in utc zu erhalten

8

Ich habe einige Zeitstempel als Postgres-Typ timestamp without time zone gespeichert.

Ich werde den Zeitstempel 2013-12-20 20:45:27 als Beispiel verwenden. Ich beabsichtige, dass dies einen UTC-Zeitstempel darstellt.

Wenn ich in psql die Abfrage SELECT start_time FROM table_name WHERE id = 1 ausfühle, bekomme ich wie erwartet diese Zeitmarke zurück: 2013-12-20 20:45:27 .

Wenn ich jedoch in meiner Node-Anwendung die node-postgres-Bibliothek verwende, um dieselbe Abfrage auszuführen, bekomme ich einen Zeitstempel in der lokalen Zeitzone zurück: Fri Dec 20 2013 20:45:27 GMT-0600 (CST) . Dies ist ein Javascript-Datumsobjekt, aber es ist bereits als diese Zeitzone gespeichert. Was ich wirklich will, ist ein Datumsobjekt (oder auch nur ein String), das 2013-12-20 20:45:27 GMT+0000 darstellt. Ich weiß bereits , dass diese Zeit UTC ist.

Ich habe versucht, den Parameter für die Zeitzone in meiner postgresql.conf-Datei auf: timezone = 'UTC' zu setzen, ohne dass sich die Ergebnisse unterscheiden.

Was mache ich falsch?

BEARBEITEN

Das Problem scheint in dieser Datei zu liegen: Ссылка

Wenn für die von Postgres zurückgegebene Datumszeichenfolge keine Zeitzone angegeben wurde (dh Z oder +06:30 , wird nur ein JavaScript-Datumsobjekt erstellt, das, wie ich glaube, nur die lokale Zeitzone enthält. Ich muss entweder meine App ändern, um Zeitzonen in der DB zu speichern oder diesen Konverter zu überschreiben.

    
Isaac Dontje Lindell 20.12.2013, 21:34
quelle

3 Antworten

12

Eine alte Frage nicht wieder aufleben zu lassen, aber zu sehen, wie ich genau das gleiche Problem hatte hier gibt es eine alternative Lösung, die durch Überschreiben des Typparsers für timestamp without time zone :

funktioniert %Vor%

Dies hält node-pg davon ab, den Wert in ein Date -Objekt zu analysieren und Ihnen stattdessen die rohe timestamp-Zeichenfolge zu geben.

Quelle: Bekam es von node-postgres-Problemen

    
BadIdeaException 06.04.2014 10:32
quelle
3

Es ist nicht die beste Lösung, aber ich habe gerade den Postgres-Typ timestamp with time zone verwendet und sichergestellt, dass alle Daten, die ich in der DB gespeichert habe, in UTC waren.

    
Isaac Dontje Lindell 20.12.2013 23:32
quelle
1

Sie können den Parser wie von @BadIdeaException vorgeschlagen modifizieren. Im Folgenden finden Sie mehr Details darüber, warum es nicht wie erwartet funktioniert und zwei mögliche Lösungen.

Bei Spalten vom Typ timestamp without time zone erhält der Parser eine Zeichenfolge im ISO 8601-Format, für die keine Zeitzone angegeben ist: 2016-07-12 22:47:34

Wenn Sie bei der Erstellung eines Date-Objekts in JavaScript keine Zeitzone angeben, wird davon ausgegangen, dass sich das Datum in der aktuellen Zeitzone befindet. Für UTC-Daten, die definitionsgemäß in der GMT-Zeitzone liegen, erhalten Sie ein Datum mit dem falschen absoluten Wert (date.value) , es sei denn, Ihr Javascript läuft zufällig in der GMT-Zeitzone .

Daher kann diese ISO 8601-Zeichenfolge nicht direkt vom Konstruktor Date in ein UTC-Datum konvertiert werden . Ihre Optionen sind: Ändern Sie die Zeichenfolge so, dass sie als UTC interpretiert wird:

%Vor%

oder lassen Sie Ihr Datum mit der "falschen" (aktuellen) Zeitzone erstellen und extrahieren Sie dann die Werte dafür (immer noch in Ihrer aktuellen Zeitzone) und verwenden Sie diese Werte, um ein Datum in der UTC-Zeitzone zu generieren . Beachten Sie, dass Date.UTC () ein Datum value anstelle eines Objekts zurückgibt, das dann an den Date-Konstruktor übergeben werden kann.

%Vor%     
stone 12.07.2016 23:29
quelle