En primer lugar, confunde java.util
con java.sql
. Cuando usa PreparedStatement#setDate()
y ResultSet#getDate()
, necesita java.sql.Date
. Análogamente, cuando usa PreparedStatement#setTimestamp()
y ResultSet#getTimestamp()
necesita java.sql.Timestamp
.
En segundo lugar, es importante entender que java.sql.Date
representa únicamente la fecha (año, mes, día) y nada menos o más. Esto se asignará a un tipo de campo SQL DATE
. El java.sql.Timestamp
representa el marca de tiempo (año, mes, día, hora, minuto, segundo, milisegundo), exactamente como lo hace java.util.Date
y java.util.Calendar
. Esto se asignará a un tipo de campo SQL TIMESTAMP
o DATETIME
.
En cuanto a las zonas horarias, las 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, de modo 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, el controlador JDBC agregará una hora a la marca de tiempo antes de volver.
Buena respuesta. Para obtener más información sobre las variaciones de las distintas clases de fecha en JDBC, puede consultar mi publicación aquí: http://stackoverflow.com/questions/2305973/java-util-date-vs-java-sql-date/2306051# 2306051 – Esko