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.
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
:
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
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.
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%Tags und Links node.js postgresql node-postgres