La API de Fecha y Hora es una de las características más importantes del lanzamiento de Java 8. Java carecía de un enfoque consistente para la fecha y la hora desde el principio y la API de Fecha y Hora de Java 8 es una adición bienvenida a las API principales de Java.
¿Por qué necesitamos una nueva API de Fecha y Hora en Java?
Antes de comenzar a examinar la API de Fecha y Hora de Java 8, veamos por qué necesitamos una nueva API para esto. Ha habido varios problemas con las clases existentes relacionadas con la fecha y la hora en Java, algunos de ellos son:
- Las clases de Fecha y Hora de Java no están definidas de manera consistente, tenemos la clase Fecha en tanto en el paquete java.util como en el paquete java.sql. Además, las clases de formato y análisis están definidas en el paquete java.text.
- java.util.Date contiene tanto valores de fecha como de hora, mientras que java.sql.Date contiene solo valores de fecha. Tener esto en el paquete java.sql no tiene ningún sentido. Además, ambas clases tienen el mismo nombre, lo cual es un diseño muy deficiente en sí mismo.
- No hay clases claramente definidas para tiempo, marca de tiempo, formato y análisis. Tenemos la clase abstracta java.text.DateFormat para necesidades de análisis y formato. Normalmente, se utiliza la clase SimpleDateFormat para análisis y formato.
- Todas las clases de Fecha son mutables, por lo que no son seguras para subprocesos. Es uno de los mayores problemas con las clases de Fecha y Calendario de Java.
- La clase Date no proporciona internacionalización, no hay soporte de zona horaria. Por lo tanto, se introdujeron las clases java.util.Calendar y java.util.TimeZone, pero también tienen todos los problemas mencionados anteriormente.
Hay algunos otros problemas con los métodos definidos en las clases Date y Calendar, pero los problemas anteriores dejan claro que se necesitaba una API de fecha y hora sólida en Java. Es por eso que Joda Time jugó un papel clave como reemplazo de calidad para los requisitos de fecha y hora en Java.
Principios de diseño de Java 8 Date Time
La API de fecha y hora de Java 8 es una implementación de JSR-310. Está diseñada para superar todas las fallas en las implementaciones de fecha y hora heredadas. Algunos de los principios de diseño de la nueva API de fecha y hora son:
-
Inmutabilidad: Todas las clases en la nueva API de fecha y hora son inmutables y adecuadas para entornos multihilo.
-
Separación de preocupaciones: La nueva API separa claramente entre fecha y hora legibles para humanos y tiempo de máquina (marca de tiempo Unix). Define clases separadas para Fecha, Hora, FechaHora, Marca de tiempo, Zona horaria, etc.
-
Claridad: Los métodos están claramente definidos y realizan la misma acción en todas las clases. Por ejemplo, para obtener la instancia actual tenemos el método now(). Hay métodos format() y parse() definidos en todas estas clases en lugar de tener una clase separada para ellos.
Todas las clases utilizan el Patrón de Fábrica y el Patrón de Estrategia para un mejor manejo. Una vez que hayas utilizado los métodos en una de las clases, trabajar con otras clases no será difícil.
-
Operaciones de utilidad: Todas las nuevas clases de la API de Fecha y Hora vienen con métodos para realizar tareas comunes, como sumar, restar, formatear, analizar, obtener la parte separada en fecha/hora, etc.
-
Extensible: La nueva API de Fecha y Hora funciona en el sistema de calendario ISO-8601 pero también podemos usarlo con otros calendarios no ISO.
Paquetes de API de Fecha y Hora
La API de Fecha y Hora de Java 8 consta de los siguientes paquetes.
- java.time: Este es el paquete base de la nueva API de Fecha y Hora de Java. Todas las principales clases base son parte de este paquete, como LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration, etc. Todas estas clases son inmutables y seguras para subprocesos. La mayoría de las veces, estas clases serán suficientes para manejar requisitos comunes.
- java.time.chrono: Este paquete define APIs genéricas para sistemas de calendario no ISO. Podemos extender la clase AbstractChronology para crear nuestro propio sistema de calendario.
- java.time.formato: Este paquete contiene clases utilizadas para formatear y analizar objetos de fecha y hora. La mayoría de las veces no las usaríamos directamente porque las clases principales en el paquete java.time proporcionan métodos de formateo y análisis.
- java.time.temporal: Este paquete contiene objetos temporales y podemos usarlo para encontrar fechas o horas específicas relacionadas con los objetos de fecha/hora. Por ejemplo, podemos usarlos para encontrar el primer o último día del mes. Puedes identificar fácilmente estos métodos porque siempre tienen el formato “withXXX”.
- Paquete java.time.zone: Este paquete contiene clases para admitir diferentes zonas horarias y sus reglas.
Ejemplos de Clases de API de Fecha y Hora de Java 8
Hemos revisado la mayoría de las partes importantes de la API de fecha y hora de Java. Es hora de analizar las clases más importantes de la API de fecha y hora con ejemplos.
1. LocalDate
LocalDate es una clase inmutable que representa una fecha con el formato predeterminado yyyy-MM-dd. Podemos usar el método now() para obtener la fecha actual. También podemos proporcionar argumentos de entrada para el año, el mes y el día para crear una instancia de LocalDate.
Esta clase proporciona un método sobrecargado para now() donde podemos pasar ZoneId para obtener fechas en una zona horaria específica. Esta clase proporciona la misma funcionalidad que java.sql.Date.
La explicación de los métodos de LocalDate se proporciona en los comentarios. Cuando ejecutamos este programa, obtenemos la siguiente salida.
2. LocalTime
LocalTime es una clase inmutable cuya instancia representa una hora en formato legible para humanos. Su formato predeterminado es hh:mm:ss.zzz. Al igual que LocalDate, esta clase proporciona soporte para zonas horarias y permite crear una instancia pasando como argumentos la hora, el minuto y el segundo.
Salida:
3. LocalDateTime
LocalDateTime es un objeto de fecha y hora inmutable que representa una fecha y hora con el formato predeterminado yyyy-MM-dd-HH-mm-ss.zzz. Proporciona un método de fábrica que toma argumentos de entrada LocalDate y LocalTime para crear una instancia de LocalDateTime.
En los tres ejemplos, hemos visto que si proporcionamos argumentos no válidos para crear Fecha/Hora, entonces lanza java.time.DateTimeException, que es una RuntimeException, por lo que no necesitamos capturarlo explícitamente.
También hemos visto que podemos obtener datos de Fecha/Hora pasando ZoneId, puedes obtener la lista de valores de ZoneId admitidos de su JavaDoc. Cuando ejecutamos la clase anterior, obtenemos la siguiente salida.
4. Instante
La clase Instante se utiliza para trabajar con el formato de tiempo legible por máquina. Instante almacena la fecha y hora en un sello de tiempo Unix.
Salida:
Utilidades de API de Fecha de Java 8
La mayoría de las clases principales de principios de Fecha y Hora proporcionan varios métodos de utilidad como más/menos días, semanas, meses, etc. También hay algunos otros métodos de utilidad para ajustar la fecha usando el TemporalAdjuster
y para calcular el período entre dos fechas.
Salida:
Java 8 Análisis y Formateo de Fechas
Es muy común formatear la fecha en diferentes formatos y luego analizar una cadena para obtener objetos de Fecha y Hora.
Salida:
Soporte de fecha y hora heredado de la API de fechas de Java
Las clases de fecha/hora heredadas se utilizan en casi todas las aplicaciones, por lo que tener compatibilidad con versiones anteriores es imprescindible. Es por eso que existen varios métodos de utilidad a través de los cuales podemos convertir clases heredadas a nuevas clases y viceversa.
Salida:
Como puedes ver, los métodos toString() de las clases heredadas TimeZone
y GregorianCalendar
son demasiado verbosos y no son amigables para el usuario.
Conclusión
I like this new Date Time API a lot. Some of the most used classes will be LocalDate and LocalDateTime. It’s very easy to work with the new classes. And, having similar methods that does a particular job makes it easy to find. It will take some time from moving legacy classes to new Date Time classes, but I believe it will be worth the time and effort.
Source:
https://www.digitalocean.com/community/tutorials/java-8-date-localdate-localdatetime-instant