Primero, estás confundiendo java.util
con java.sql
. Al usar PreparedStatement#setDate()
y ResultSet#getDate()
, necesita java.sql.Date
. Análogamente, al usar PreparedStatement#setTimestamp()
y ResultSet#getTimestamp()
necesita java.sql.Timestamp
.
En segundo lugar, es importante comprender que java.sql.Date
representa únicamente la fecha (año, mes, día) y nada menos ni más. Esto se debe asignar a un SQL DATE
Tipo de campo. El java.sql.Timestamp
representa la marca de tiempo (año, mes, día, hora, minuto, segundo, milisegundo), exactamente como java.util.Date
y java.util.Calendar
lo hace. Esto debe asignarse a un SQL TIMESTAMP
o DATETIME
tipo de campo.
En cuanto a las zonas horarias, lo necesita cuando la base de datos no almacena información de zona horaria (por lo tanto, todas las marcas de tiempo se almacenan en UTC (GMT)). A continuación, puede pasar un Calendar
en el que contiene información sobre la zona horaria actual, para que el controlador JDBC pueda ajustar la marca de tiempo UTC a la marca de tiempo que conforma la zona horaria. Si es, por ejemplo, GMT+1, entonces el controlador JDBC agregará una hora a la marca de tiempo antes de regresar.