Il problema è che Java Date
gli oggetti non memorizzano un fuso orario. Il valore è sempre in UTC e viene analizzato e formattato in un determinato fuso orario, in genere il fuso orario predefinito della JVM.
Oracle DATE
le colonne vengono memorizzate anche senza fuso orario, ma devono rappresentare la data vista dall'utente. Nel 99,99% dei casi, ciò significa la data nel fuso orario predefinito della JVM.
Quindi, il driver JDBC prende il Timestamp
/ Date
value, che è in UTC, lo converte nel fuso orario predefinito e lo salva nel database.
Stai utilizzando PreparedStatement.setTimestamp(int parameterIndex, Timestamp x)
metodo. Per controllare il fuso orario, utilizzare PreparedStatement.setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
metodo. Citando il javadoc: