Når du gemmer et timestamp with time zone
(timestamptz
) den konverteres til UTC til lagring i DB. Når den hentes, konverteres den til klientens aktuelle tidszone, ikke den tidszone, den oprindeligt var i. Det er grundlæggende et tidspunkt.
Der er også timestamp without time zone
(timestamp
). Dette er ikke genstand for konvertering, men ikke bære et tidsstempel med sig. Hvis du gemmer et timestamp
med din klienttidszone sat til UTC, og hent den derefter, når klientens tidszone er '+08:00', får du den samme værdi. Det er det halve, du ønsker, i og med at det bevarer den rå tidsværdi.
Navnene og adfærden er forfærdelige og forvirrende, men sat af SQL-standarden.
Du skal gemme tidszonen separat, hvis du ønsker at optage et tidspunkt i en bestemt tidszone. Jeg vil anbefale, at du gemmer det som et INTERVAL
med en CHECK
begrænsning, der begrænser det til at være colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
. Denne definition afviser -12:00 og accepterer +12:00; Jeg er ikke helt sikker på, at det er rigtigt, så tjek det.
Du kan enten gemme timestamp
af lokal tid i den tidszone (hvad jeg sandsynligvis ville gøre), eller gemme timestamptz
af UTC-tiden, hvor hændelsen fandt sted, plus en offset, der lader dig konvertere den til lokal tid.
Begge vil fungere fint for JDBC. For JPA vil det afhænge af, hvor godt din udbyder forstår og kortlægger intervaltyper. Ideelt set vil du have et forbigående genereret felt i din enhed, der rekonstruerer den kalenderforekomst, du ønsker, ved hjælp af timestamp
og interval
gemt i databasen.