Follow-up-Frage zu meinem Original issue.Postgres UTC Java ZonedDateTime
Da ich weiß, dass jede verwendete Datumszeit für eine bekannte Zeitzone ist und nicht, wo der Benutzer seine Anfrage absetzt, nehme ich eine LocalDateTime, konvertiere nach UTC und bleibe bestehen. Dann, wenn der Termin abgerufen wird, konvertiere ich die gespeicherte Zeit in die Zeitzone des Besprechungsorts (gespeichert in db). Es scheint jedoch, dass die Werte, die ich speichere, tatsächlich in meiner lokalen Zeitzone gespeichert werden.
I erhalten ein Datum Zeitwert im Rest-Controller wie:
startLocalDateTime: 2016-04-11T10:00
endLocalDateTime: 2016-04-11T10:30
Termin hat zwei ZoneDateTime Felder:
@Column(name = "startDateTime", columnDefinition= "TIMESTAMP WITH TIME ZONE")
private ZonedDateTime startDateTime;
@Column(name = "endDateTime", columnDefinition= "TIMESTAMP WITH TIME ZONE")
private ZonedDateTime endDateTime;
Dann wechsle ich die Werte in UTC und speichern auf meiner Einheit speichern zu Postgres:
appointment.setStartDateTime(startLocalDateTime.atZone(ZoneId.of("UTC")))
appointment.setEndDateTime(endLocalDateTime.atZone(ZoneId.of("UTC")))
und ich speichern, dass in Postgres (columnDefinition= "TIMESTAMP WITH TIME ZONE")
Wh en ich bei der Aufzeichnung in pgAdminIII aussehen sehe ich:
startDateTime "2016-04-11 04:00:00-06"
endDateTime "2016-04-11 04:30:00-06"
diese richtig im UTC-Format gespeichert werden, so erscheinen (bitte korrigieren Sie mich, wenn ich so viel falsch machen etwas tue). Ich sie dann aus der Datenbank abrufen und sie zurückgegeben werden, wie:
{
"appointmentId":50,
"startDateTime":"2016-04-11T04:00",
"endDateTime":"2016-04-11T04:30"
}
sogar So obwohl ich sie als UTC speichere, wenn ich sie sie abrufen:
Appointment
startdatetime: 2016-04-11T04:00-06:00[America/Denver]
enddatetime: 2016-04-11T04:30-06:00[America/Denver]
Diese Werte zurück als JSON gesendet werden sind in MST (meiner lokalen) Zeitzone, anstatt UTC, und ich bin nicht in der Lage, sie zurück in die tatsächliche Zeit zu konvertieren.
Immer noch mit der Hartnäckigkeit zu kämpfen. Ich habe versucht, die java.sql.timestamp, java.sql.Date, java.util.Date und java.time.ZonedDateTime für meine Entität zu verwenden. Mein Postgres ist immer noch ein "Zeitstempel mit Zeitzone". Aber weil ich Spring-Data-JPA verwende und mit dem gleichen Typ abfragen muss. Wenn ich Date verwende - sollte das sql.Date oder util.Date sein?
Sie werden immer noch in UTC gespeichert, da ein Java-Datum ** immer ** ** UTC ** ist (wenn es eine lokale Zeitzone enthält, wurde es formatiert). –
Ich denke, ich verstehe nicht, warum die DB zeigt sie im UTC-Format und auch wenn sie als Teil eines Termins zurückgegeben wird, ist die Zeit UTC, aber die Zone scheint "Amerika/Denver" und nicht "UTC". Wie kann ich die korrekte Zeit zurückbekommen? – sonoerin
Wie siehst du *** die Zeit? Weil Java "Date" als eine Anzahl von Millisekunden seit dem 1. Januar 1970 um Mitternacht UTC (aka EPOCH) speichert. –