Primeiro, você está confundindo
java.util
com java.sql
. Ao usar PreparedStatement#setDate()
e ResultSet#getDate()
, você precisa de java.sql.Date
. Analogamente, ao usar PreparedStatement#setTimestamp()
e ResultSet#getTimestamp()
você precisa de java.sql.Timestamp
. Segundo, é importante entender que
java.sql.Date
representa apenas a data (ano, mês, dia) e nada mais ou menos. Isso deve ser mapeado para um SQL DATE
tipo de campo. O java.sql.Timestamp
representa o carimbo de data e hora (ano, mês, dia, hora, minuto, segundo, milissegundo), exatamente como o java.util.Date
e java.util.Calendar
faz. Isso deve ser mapeado para um SQL TIMESTAMP
ou DATETIME
tipo de campo. Quanto aos fusos horários, você precisa dele quando o banco de dados não armazena informações de fuso horário (assim, todos os timestamps são armazenados em UTC (GMT)). Você pode então passar um
Calendário
em que contém informações sobre o fuso horário atual, para que o driver JDBC possa ajustar o timestamp UTC para o timestamp em conformidade com o fuso horário. Se for, por exemplo, GMT+1, o driver JDBC adicionará uma hora ao carimbo de data/hora antes de retornar.