Solución:
No importa….
public class MainClass {
public static void main(String[] args) {
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
System.out.println("utilDate:" + utilDate);
System.out.println("sqlDate:" + sqlDate);
}
}
lo explica. El enlace es http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm
tl; dr
¿Cómo convertir java.util.Date a java.sql.Date?
No lo hagas. Ambas clases están pasadas de moda.
- Usar java.time clases en lugar de legado
java.util.Date
Yjava.sql.Date
con JDBC 4.2 o posterior. - Convierta a / desde java.time si interactúa con un código que aún no se ha actualizado a java.time.
Consulta de ejemplo 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 dejava.util.Date
Ambos representan un momento en UTC. pero ahora con nanosegundos en lugar de milisegundos. -
LocalDate
en lugar dejava.sql.Date
Ambos representan un valor de solo fecha sin una hora del día y sin una zona horaria.
Detalles
Si está intentando trabajar con valores de solo fecha (sin hora del día, sin zona horaria), utilice el LocalDate
clase en lugar de java.util.Date
.
java.time
En Java 8 y versiones posteriores, el nuevo paquete java.time ha reemplazado a las problemáticas clases de fecha y hora antiguas incluidas con las primeras versiones de Java. Consulte el tutorial de Oracle. Gran parte de la funcionalidad se ha actualizado 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 una clase así † hasta java.time.LocalDate
en Java 8. Creemos ese valor obteniendo la fecha de hoy de acuerdo con una zona horaria en particular (la zona horaria es importante para determinar una fecha, ya que un nuevo día amanece antes en París que en Montreal, por 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 terminar. Si su controlador JDBC cumple con la especificación JDBC 4.2, debería poder pasar una LocalDate
vía setObject
en un PreparedStatement
para almacenar en un campo FECHA SQL.
myPreparedStatement.setObject( 1 , localDate );
Del mismo modo, utilice ResultSet::getObject
para recuperar de una columna SQL DATE a un Java LocalDate
objeto. Especificar la clase en el segundo argumento hace que su código sea seguro para los tipos.
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
En otras palabras, toda esta pregunta es irrelevante según JDBC 4.2 o después.
Si su controlador JDBC no funciona de esta manera, debe recurrir a la conversión a los tipos java.sql.
Convierta 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(…)
convertir un LocalDate
.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
Y yendo en la otra dirección.
LocalDate localDate = sqlDate.toLocalDate();
Conversión de java.util.Date
Si bien debe evitar el uso de las antiguas clases de fecha y hora, es posible que se vea obligado a hacerlo cuando trabaje con código existente. Si es así, puede convertir a / desde java.time.
Ir a través de Instant
class, que representa un momento en la línea de tiempo en UTC. Un Instant
es similar en idea a un java.util.Date
. Pero tenga en cuenta que Instant
tiene una resolución de hasta nanosegundos mientras java.util.Date
sólo 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 un momento dado, la fecha varía en todo el mundo según la zona horaria. Aplicar una ZoneId
conseguir un ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† La clase java.sql.Date pretende ser de solo fecha sin una hora del día, pero en realidad lo 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
los java.time framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan las antiguas y problemáticas clases de fecha y hora heredadas, como java.util.Date
, Calendar
Y SimpleDateFormat
.
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.
los Joda-Time proyecto, ahora en modo de mantenimiento, aconseja la migración a las clases java.time.
Puedes intercambiar java.time objetos directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. Sin necesidad de cuerdas, sin necesidad de java.sql.*
clases. Compatibilidad con Hibernate 5 y JPA 2.2 java.time.
¿Dónde obtener las clases java.time?
-
Java SE 8, Java SE 9, Java SE 10, Java SE 11y posterior: parte de la API estándar de Java con una implementación integrada.
- Java 9 trajo algunas características menores y correcciones.
-
Java SE 6 y Java SE 7
- La mayoría de java.time la funcionalidad está respaldada a Java 6 y 7 en ThreeTen-Backport.
-
Androide
- Versiones posteriores de implementaciones de paquetes de Android (26+) del java.time clases.
- Para Android anterior (<26), un proceso conocido como API desugaring trae un subconjunto del java.time funcionalidad no incorporada originalmente en Android.
- Si el desugaring no ofrece lo que necesita, el ThreeTenABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente) a Android. Ver Cómo usar ThreeTenABP….
los ThreeTen-Extra El proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
, y más.
Con la otra respuesta, es posible que tenga problemas con la información de la hora (¡compare las fechas con resultados inesperados!)
Yo sugiero:
java.util.Calendar cal = Calendar.getInstance();
java.util.Date utilDate = new java.util.Date(); // your util date
cal.setTime(utilDate);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
java.sql.Date sqlDate = new java.sql.Date(cal.getTime().getTime()); // your sql date
System.out.println("utilDate:" + utilDate);
System.out.println("sqlDate:" + sqlDate);