El problema es que Java Date
los objetos no almacenan una zona horaria. El valor es siempre en UTC, y se analiza y formatea en una zona horaria determinada, generalmente la zona horaria predeterminada de la JVM.
Oracle DATE
las columnas también se almacenan sin zona horaria, pero deben representar la fecha tal como la ve el usuario. En el 99,99 % de los casos, eso significa la fecha en la zona horaria predeterminada de la JVM.
Entonces, el controlador JDBC toma el Timestamp
/ Date
El valor, que está en UTC, lo convierte a la zona horaria predeterminada y lo guarda en la base de datos.
Está utilizando PreparedStatement.setTimestamp(int parameterIndex, Timestamp x)
método. Para controlar la zona horaria, utilice PreparedStatement.setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
método. Citando el javadoc: