tl; dr
¿Cómo convertir java.util.Date a java.sql.Date?
No lo hagas Ambas clases están pasadas de moda.
- Utilice las clases java.time en lugar de heredadas
java.util.Datey java.sql.Datecon JDBC 4.2 o posterior.
- Convierta a / desde java.time si interopera con código que aún no se ha actualizado a java.time.
Ejemplo de consulta con PreparedStatement.
myPreparedStatement.setObject(
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)
Reemplazos:
Instanten lugar de java.util.Date
Ambos representan un momento en UTC. pero ahora con nanosegundos en lugar de milisegundos.
LocalDateen lugar de java.sql.Date
Ambos representan un valor de solo fecha sin hora del día y sin zona horaria.
Detalles
Si está intentando trabajar con valores de solo fecha (sin hora del día, sin zona horaria), use la LocalDateclase en lugar de java.util.Date.

java.time
En Java 8 y versiones posteriores, el nuevo paquete java.time ha suplantado las viejas clases problemáticas de fecha y hora agrupadas con versiones anteriores de Java . Vea el tutorial de Oracle . Gran parte de la funcionalidad se ha transferido a Java 6 y 7 en ThreeTen-Backport y se ha adaptado aún más a Android en ThreeTenABP .
Un tipo de datos SQL DATE está destinado a ser solo de fecha, sin hora del día ni zona horaria. Java nunca tuvo precisamente esa clase † hasta java.time.LocalDateen Java 8. Creemos ese valor obteniendo la fecha de hoy de acuerdo con una zona horaria particular (la zona horaria es importante para determinar una fecha como un nuevo día amanece más temprano en París que en Montreal, para ejemplo).
LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) ); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".
En este punto, podemos haber terminado. Si su controlador JDBC cumple con la especificación JDBC 4.2 , debería poder pasar una LocalDatevía setObjecten una PreparedStatementpara almacenar en un campo FECHA SQL.
myPreparedStatement.setObject( 1 , localDate );
Del mismo modo, use ResultSet::getObjectpara buscar desde una columna FECHA SQL a un LocalDateobjeto Java . Especificar la clase en el segundo argumento hace que su código sea seguro .
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
En otras palabras, toda esta pregunta es irrelevante en JDBC 4.2 o posterior.
Si su controlador JDBC no funciona de esta manera, debe recurrir a la conversión a los tipos java.sql.
Convertir a java.sql.Date
Para convertir, use nuevos métodos agregados a las antiguas clases de fecha y hora. Podemos llamar java.sql.Date.valueOf(…)para convertir a LocalDate.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
Y yendo en la otra dirección.
LocalDate localDate = sqlDate.toLocalDate();
Convertir de java.util.Date
Si bien debe evitar el uso de las antiguas clases de fecha y hora, puede verse obligado a hacerlo cuando trabaje con el código existente. Si es así, puede convertir a / desde java.time.
Ir a través de la Instantclase, que representa un momento en la línea de tiempo en UTC. An Instantes similar en idea a a java.util.Date. Pero tenga en cuenta que Instanttiene una resolución de hasta nanosegundos, mientras que java.util.Datesolo tiene una resolución de milisegundos .
Para convertir, use nuevos métodos agregados a las clases antiguas. Por ejemplo, java.util.Date.from( Instant )y java.util.Date::toInstant.
Instant instant = myUtilDate.toInstant();
Para determinar una fecha, necesitamos el contexto de una zona horaria. Para cualquier momento, la fecha varía en todo el mundo por zona horaria. Aplica a ZoneIdpara obtener a ZonedDateTime.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† La clase java.sql.Date pretende ser solo de fecha sin una hora del día, pero en realidad hace una hora del día, ajustada a la medianoche. ¿Confuso? Sí, las antiguas clases de fecha y hora son un desastre.
Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date, Calendar, y SimpleDateFormat.
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de java.sql.*clases.
¿Dónde obtener las clases java.time?

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más .