Le problème est que Java Date
les objets ne stockent pas de fuseau horaire. La valeur est toujours en UTC, et est analysé et formaté dans un fuseau horaire donné, généralement le fuseau horaire par défaut de la JVM.
Oracle DATE
les colonnes sont également stockées sans fuseau horaire, mais doivent représenter la date telle que vue par l'utilisateur. Dans 99,99 % des cas, cela signifie la date dans le fuseau horaire par défaut de la JVM.
Ainsi, le pilote JDBC prend le Timestamp
/ Date
valeur, qui est en UTC, la convertit dans le fuseau horaire par défaut et l'enregistre dans la base de données.
Vous utilisez PreparedStatement.setTimestamp(int parameterIndex, Timestamp x)
méthode. Pour contrôler le fuseau horaire, utilisez PreparedStatement.setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
méthode. Citant le javadoc :