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.Date
y java.sql.Date
con 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:
Instant
en lugar de java.util.Date
Ambos representan un momento en UTC. pero ahora con nanosegundos en lugar de milisegundos.
LocalDate
en 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 LocalDate
clase 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.LocalDate
en 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 LocalDate
vía setObject
en una PreparedStatement
para almacenar en un campo FECHA SQL.
myPreparedStatement.setObject( 1 , localDate );
Del mismo modo, use ResultSet::getObject
para buscar desde una columna FECHA SQL a un LocalDate
objeto 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 Instant
clase, que representa un momento en la línea de tiempo en UTC. An Instant
es similar en idea a a java.util.Date
. Pero tenga en cuenta que Instant
tiene una resolución de hasta nanosegundos, mientras que java.util.Date
solo 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 ZoneId
para 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 .