När du lagrar en timestamp with time zone
(timestamptz
) den konverteras till UTC för lagring i DB. När den hämtas omvandlas den till klientens aktuella tidszon, inte den tidszon den ursprungligen var i. Det är i princip en tidpunkt.
Det finns också timestamp without time zone
(timestamp
). Detta är inte föremål för konvertering, men gör det inte bär en tidsstämpel med sig. Om du lagrar en timestamp
med din klienttidszon inställd på UTC och hämta den sedan när klientens tidszon är '+08:00' får du samma värde. Det är hälften av vad du vill ha, eftersom det bevarar det råa tidsvärdet.
Namnen och beteenden är hemska och förvirrande, men ställs in av SQL-standarden.
Du måste lagra tidszonen separat om du vill spela in en tidpunkt i en viss tidszon. Jag rekommenderar att du lagrar det som ett INTERVAL
med en CHECK
begränsning som begränsar det till att vara colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
. Den definitionen förkastar -12:00 och accepterar +12:00; Jag är inte helt säker på att det stämmer, så kolla.
Du kan antingen lagra timestamp
lokal tid i den tidszonen (vad jag förmodligen skulle göra) eller lagra timestamptz
av UTC-tiden när händelsen inträffade plus en offset som låter dig konvertera den till lokal tid.
Båda kommer att fungera bra för JDBC. För JPA beror det på hur väl din leverantör förstår och kartlägger intervalltyper. Helst vill du ha ett övergående genererat fält i din enhet som rekonstruerar den kalenderinstans du vill använda med timestamp
och interval
lagras i databasen.