Convertir de Date a LocalDate o LocalDateTime
En esta entrada vamos a ver las aproximaciones que tenemos para convertir de Date a LocalDate o LocalDateTime y desde LocalDateTime o LocalDate a Date.
Con la incorporación a Java del paquete Java.time.* en Java 8 el tratamiento de las fechas y su uso se mejora y a veces nos encontramos con fechas en formato anterior a Java 8 que hay que convertir.
Transformar a Date desde LocalDate en Java
Para convertir un objeto de Date a LocalDate en Java vamos a hacer uso del método toInstant(), ofEpochMilli(), toLocalDate() y ofInstant().
Vamos a ver tres aproximaciones diferentes:
- Invocando a toInstant(): El método toInstant() en Java fue introducido en Java 8 al paquete java.util.Date. Es necesario informar del time zone a través del ZoneId
- Haciendo uso de ofEpochMilli(): Este método pertenece a Instant. Devuelve una instancia de Instant en milisegundos. Es necesario informar del time zone a través del ZoneId
- Utilizando toLocalDate(): Haciendo de toLocalDate de java.sql.Date.
- Utilizando ofInstant(): Método introducido en Java 9 que facilita la conversión.
Vamos a ver como convertir un objeto a LocalDate haciendo uso de toInstant().
public LocalDate fromDateToLocalDate(Date date) { return date.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); }
A continuación el siguiente ejemplo convierte un objeto Date a LocalDate haciendo uso de Instant.ofEpochMilli.
public LocalDate fromDateToLocalDate(Date date) { return Instant.ofEpochMilli(date.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDate(); }
Vamos a echar un vistazo a la clase Date de java.sql. El método Date de java.sql.Date permite convertir a LocalDate haciendo uso del método toLocalDate que se encuentra en la clase.
public LocalDate fromDateToLocalDate(Date date) { return new java.sql.Date(date.getTime()).toLocalDate(); }
Finalmente si utilizamos Java 9 podemos hacer uso de ofInstant de LocalDate para convertir a LocalDate y LocalDateTime:
public LocalDate fromDateToLocalDate(Date date) { return LocalDate.ofInstant( date.toInstant(), ZoneId.systemDefault()); }
A continuación vamos a convertir a LocalDateTime donde la aproximación es similar.
Convertir de Date a LocalDate en Java
Al igual que hemos hecho en el paso anterior vamos a convertir a LocalDateTime desde un objeto Date. Vamos a utilizar las mismas tres aproximaciones que para convertir de Date a LocalDate.
Haciendo uso de toInstant():
public LocalDateTime fromDateToLocalDateTime(Date date) { return date.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); }
Haciendo uso de Instant():
public LocalDateTime fromDateToLocalDateTime(Date date) { return Instant.ofEpochMilli(date.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDateTime(); }
Transformar a LocalDateTime desde java.sql.Date:
public LocalDateTime fromDateToLocalDateTime(Date date) { return new java.sql.Date(date.getTime()).toLocalDateTime(); }
Utilizar ofInstant de Java 9 para convertir a LocalDateTime:
public LocalDateTime fromDateToLocalDateTime(Date date) { return LocalDateTime.ofInstant( date.toInstant(), ZoneId.systemDefault());
Convertir desde LocalDate a Date
Vamos a ver como podemos convertir objetos de tipo LocalDate a java.util.Date haciendo uso de Date.from():
public Date toDate(LocalDate localDate) { return Date.from(localDate.atStartOfDay() .atZone(ZoneId.systemDefault()) .toInstant()); }
Hay que tener en cuenta que hacemos uso de ZoneId por defecto del sistema para establecer la zona.
Convertir a Date desde LocalDateTime
Con la misma aproximación que para convertir de LocalDate a Date vamos a convertir de LocalDateTime a Date:
public Date toDate(LocalDateTime localDateTime) { return java.util.Date.from(localDateTime.atZone(ZoneId.systemDefault()) .toInstant()); }
Conclusión
Cuando trabajamos con diferentes tipos de fecha de Java es muy importante conocer como convertirlas para poder homogeneizar las fechas y mostrarlas según se requiera en nuestra aplicación. En este artículo hemos podido ver las diferentes aproximaciones para convertir de Date a LocalDate o LocalDateTime y viceversa.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!