Es scheint (und vielleicht irre ich mich), wenn Sie die Zeitzone, in der etwas mit JDBC und Postgres passiert ist, erhalten wollen, müssen Sie die Zeitzone getrennt vom Zeitstempel speichern.
Das wäre, würde ich meinem ORM / JDBC / JPA lieber ein Java Calendar
(oder Joda DataTime
) geben mit der Zeitzone America/New_York
an ein Postgres timestampz
Feld. UND ich würde beim Abruf erwarten, unabhängig von der Server-Zeitzone (oder Standard auf UTC), um mir eine Calendar
mit Zeitzone America/New_York
zurückzugeben. Aber nur auf die meisten JDBC-Code (und Dinge, die davon abhängen, die nicht passieren).
Ist das korrekt?
Das scheint lächerlich, dass ich die tz in einem anderen Feld speichern müsste, wenn Postgres es unterstützt.
Es scheint also, als wären die einzigen zwei Optionen:
timestampz
Postgres als java.util.String
aus und parsen Sie sie. Option eins und zwei würde eine Art von Umwandlungs-Interzeptoren für meine SQL-Mapping / ORM-Bibliotheken erfordern.
Wenn Sie ein timestamp with time zone
( timestamptz
) speichern, wird es für die Speicherung in der DB in UTC konvertiert. Wenn es abgerufen wird, wird es in die aktuelle Zeitzone des Clients konvertiert, nicht in die Zeitzone, in der es ursprünglich war. Es ist im Grunde ein Zeitpunkt.
Es gibt auch timestamp without time zone
( timestamp
). Dies unterliegt keiner Konvertierung, aber nicht enthält einen Zeitstempel. Wenn Sie eine timestamp
mit Ihrer Client-Zeitzone auf UTC speichern und diese dann abrufen, wenn die Client-Zeitzone "+08: 00" lautet, erhalten Sie den gleichen Wert. Das ist die Hälfte, die Sie wollen, indem es den Wert der Rohzeit beibehält.
Die Namen und Verhaltensweisen sind schrecklich und verwirrend, werden aber vom SQL-Standard festgelegt.
Sie müssen die Zeitzone separat speichern, wenn Sie einen Zeitpunkt in einer bestimmten Zeitzone erfassen möchten. Ich würde empfehlen, es als INTERVAL
mit einer CHECK
Einschränkung zu speichern, die es auf colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
beschränkt. Diese Definition weist -12: 00 zurück und akzeptiert +12: 00; Ich bin mir nicht ganz sicher, ob das stimmt, also schau nach.
Sie könnten entweder timestamp
der lokalen Zeit in dieser Zeitzone speichern (was ich wahrscheinlich tun würde) oder die timestamptz
der UTC-Zeit speichern, als das Ereignis auftrat, plus einen Offset, mit dem Sie es konvertieren können Ortszeit.
Bei JDBC funktioniert beides. Für JPA hängt es davon ab, wie gut Ihr Anbieter Intervalltypen versteht und abbildet. Im Idealfall möchten Sie ein transient erzeugtes Feld in Ihrer Entität, das die gewünschte Kalenderinstanz mit den in der Datenbank gespeicherten timestamp
und interval
rekonstruiert.
Tags und Links java jpa postgresql jdbc