Quando memorizzi un timestamp with time zone
(timestamptz
) viene convertito in UTC per l'archiviazione nel DB. Una volta recuperato, viene convertito nel fuso orario corrente del cliente, non nel fuso orario in cui si trovava originariamente. In pratica è un punto nel tempo.
C'è anche timestamp without time zone
(timestamp
). Questo non è soggetto a conversione, ma non portare con sé un timestamp. Se memorizzi un timestamp
con il fuso orario del cliente impostato su UTC, quindi recuperalo quando il fuso orario del cliente è "+08:00", ottieni lo stesso valore. È la metà di quello che vuoi, in quanto preserva il valore del tempo grezzo.
I nomi e i comportamenti sono orribili e confusi, ma stabiliti dallo standard SQL.
È necessario memorizzare il fuso orario separatamente se si desidera registrare un momento in un determinato fuso orario. Consiglierei di salvarlo come INTERVAL
con un CHECK
vincolo che lo limita ad essere colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
. Tale definizione rifiuta -12:00 e accetta +12:00; Non sono del tutto sicuro che sia giusto, quindi controlla.
Puoi memorizzare il timestamp
dell'ora locale in quel fuso orario (cosa che probabilmente farei) o memorizzare il timestamptz
dell'ora UTC in cui si è verificato l'evento più un offset che ti consente di convertirlo nell'ora locale.
Entrambi funzioneranno bene per JDBC. Per JPA, dipenderà da quanto bene il tuo provider comprende e mappa i tipi di intervallo. Idealmente, desideri un campo generato transitorio nella tua entità che ricostruisca l'istanza di Calendar che desideri utilizzando il timestamp
e interval
memorizzato nel database.