Saltar al contenido

¿Cómo convertir java.util.Date a java.sql.Date?

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 Y java.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 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 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.

Tabla de tipos de fecha y hora en Java (tanto heredado como moderno) y en el estándar SQL.

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, CalendarY 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….

Tabla de qué biblioteca java.time usar con qué versión de Java o Android

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);
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *