Wanneer u een timestamp with time zone
. opslaat (timestamptz
) het wordt geconverteerd naar UTC voor opslag in de DB. Wanneer het wordt opgehaald, wordt het geconverteerd naar de huidige tijdzone van de klant, niet naar de tijdzone waarin het zich oorspronkelijk bevond. Het is in feite een tijdstip.
Er is ook timestamp without time zone
(timestamp
). Dit is niet onderhevig aan conversie, maar niet draag er een tijdstempel bij. Als u een timestamp
. opslaat met uw clienttijdzone ingesteld op UTC en deze vervolgens ophalen wanneer de clienttijdzone '+08:00' is, krijgt u dezelfde waarde. Dat is de helft van wat je wilt, in die zin dat het de onbewerkte tijdswaarde behoudt.
De namen en het gedrag zijn verschrikkelijk en verwarrend, maar bepaald door de SQL-standaard.
U moet de tijdzone apart opslaan als u een tijdstip in een bepaalde tijdzone wilt vastleggen. Ik raad aan om het op te slaan als een INTERVAL
met een CHECK
beperking die het beperkt tot colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
. Die definitie verwerpt -12:00 en accepteert +12:00; Ik weet niet helemaal zeker of dat klopt, dus controleer.
U kunt ofwel de timestamp
. opslaan van lokale tijd in die tijdzone (wat ik waarschijnlijk zou doen), of sla de timestamptz
op van de UTC-tijd waarop de gebeurtenis plaatsvond plus een offset waarmee u deze kunt omrekenen naar lokale tijd.
Beide zullen prima werken voor JDBC. Voor JPA hangt het af van hoe goed uw provider de intervaltypen begrijpt en in kaart brengt. Idealiter wilt u een tijdelijk gegenereerd veld in uw entiteit dat de gewenste Calendar-instantie reconstrueert met behulp van de timestamp
en interval
opgeslagen in de databank.