1. Información general
Comenzando con Java 8, tenemos una nueva API de fecha: java.time .
Sin embargo, a veces todavía necesitamos realizar conversiones entre las API nuevas y antiguas, y trabajar con representaciones de fechas de ambas.
2. Conversión de java.util.Date en java.time.LocalDate
Comencemos por convertir la antigua representación de fecha a la nueva.
Aquí, podemos aprovechar un nuevo método toInstant () , que se agregó a java.util.Date en Java 8.
Cuando estamos convirtiendo un objeto instantáneo , es necesario usar un ZoneId porqueLos objetos instantáneos son independientes de la zona horaria , solo puntos en la línea de tiempo.
La API atZone (ZoneId zone) del objeto Instant devuelve un ZonedDateTime , por lo que solo necesitamos extraer LocalDate de él utilizando el método toLocalDate () .
Primero, usamos el ZoneId del sistema predeterminado :
public LocalDate convertToLocalDateViaInstant(Date dateToConvert) { return dateToConvert.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); }
Y una solución similar pero con una forma diferente de crear un objeto Instant , usando el método ofEpochMilli () :
public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) { return Instant.ofEpochMilli(dateToConvert.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDate(); }
Antes de continuar, también echemos un vistazo rápido a la antigua clase java.sql.Date y cómo se puede convertir también a LocalDate .
Comenzando con Java 8, podemos encontrar un método toLocalDate () adicional en java.sql.Date , que también nos brinda una manera fácil de convertirlo a java.time.LocalDate .
En este caso, no debemos preocuparnos por la zona horaria:
public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) { return new java.sql.Date(dateToConvert.getTime()).toLocalDate(); }
De manera muy similar, también podemos convertir un objeto Date antiguo en un objeto LocalDateTime . Echemos un vistazo a eso a continuación.
3. Conversión de java.util.Date en java.time.LocalDateTime
Para obtener una instancia de LocalDateTime , podemos usar de manera similar un ZonedDateTime intermediario y luego usar la API toLocalDateTime () .
Al igual que antes, podemos usar dos posibles soluciones para obtener un objeto Instant de java.util.Date :
public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) { return dateToConvert.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); } public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) { return Instant.ofEpochMilli(dateToConvert.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDateTime(); }
Y comenzando con Java 8, también podemos usar java.sql.Timestamp para obtener un LocalDateTime :
ocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) { return new java.sql.Timestamp( dateToConvert.getTime()).toLocalDateTime(); }
4. Convierta java.time.LocalDate en java.util.Date
Ahora que tenemos una buena comprensión de cómo convertir de la antigua representación de datos a la nueva, echemos un vistazo a la conversión en la otra dirección.
Discutiremos dos formas posibles de convertir LocalDate en Date .
En el primero, usamos un nuevo método valueOf (LocalDate date) proporcionado en el objeto java.sql.Date , que toma LocalDate como parámetro:
public Date convertToDateViaSqlDate(LocalDate dateToConvert) { return java.sql.Date.valueOf(dateToConvert); }
Como podemos ver, es fácil e intuitivo. Utiliza la zona horaria local para la conversión (todo se hace bajo el capó, por lo que no debe preocuparse).
En otro ejemplo de Java 8, usamos un objeto Instant que pasamos al método from (Instant instant) del objeto java.util.Date :
public Date convertToDateViaInstant(LocalDate dateToConvert) { return java.util.Date.from(dateToConvert.atStartOfDay() .atZone(ZoneId.systemDefault()) .toInstant()); }
Observe que aquí usamos un objeto Instant y que también debemos preocuparnos por las zonas horarias al hacer esta conversión.
A continuación, usemos una solución muy similar para convertir un LocalDateTime en un objeto Date .
5. Convierta java.time.LocalDateTime en java.util.Date
La forma más fácil de obtener un java.util.Date de LocalDateTime es usar una extensión para java.sql.Timestamp , disponible con Java 8:
public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) { return java.sql.Timestamp.valueOf(dateToConvert); }
Pero, por supuesto, una solución alternativa es usar un objeto Instant , que obtenemos de ZonedDateTime :
Date convertToDateViaInstant(LocalDateTime dateToConvert) { return java.util.Date .from(dateToConvert.atZone(ZoneId.systemDefault()) .toInstant()); }
6. Adiciones de Java 9
En Java 9, hay nuevos métodos disponibles que simplifican la conversión entre java.util.Date y java.time.LocalDate o java.time.LocalDateTime .
LocalDate.ofInstant (Instant instant, ZoneId zone) y LocalDateTime.ofInstant (Instant instant, ZoneId zone) proporcionan prácticos atajos:
public LocalDate convertToLocalDate(Date dateToConvert) { return LocalDate.ofInstant( dateToConvert.toInstant(), ZoneId.systemDefault()); } public LocalDateTime convertToLocalDateTime(Date dateToConvert) { return LocalDateTime.ofInstant( dateToConvert.toInstant(), ZoneId.systemDefault()); }
7. Conclusión
En este artículo, cubrimos posibles formas de convertir el antiguo java.util.Date en los nuevos java.time.LocalDate y java.time.LocalDateTime , así como al revés.
La implementación completa de este artículo está disponible en GitHub.