Java finalmente tiene una forma intuitiva y confiable de trabajar con fechas y horas. Los principios de fecha y hora son fundamentales en muchas aplicaciones. Varias cosas, como fechas de nacimiento, fechas de alquiler, horarios de eventos y horarios de apertura de tiendas, se basan en fechas y horas, pero Java SE no proporcionó una forma conveniente de trabajar con ellos. A partir de Java SE 8 , hubo un conjunto de paquetes java.time , que proporcionan una API bien estructurada para trabajar con fechas y horas.
A continuación se muestra una pequeña lista de problemas existentes en su implementación:
Fondo
Cuando apareció Java por primera vez, en la versión 1.0 , la única clase para trabajar con fechas y horas era java.util.Date . Lo primero que notaron los desarrolladores fue que no representa una "fecha". De hecho, representa un momento en el tiempo, con una precisión de milisegundos, medido a partir de la fecha del 1 de enero de 1970. Sin embargo, basándose en el hecho de que el método toString() de Date muestra la fecha y la hora en la zona horaria especificada en la configuración de Java de la máquina , algunos desarrolladores concluyeron erróneamente que Date puede funcionar con zonas horarias. Arreglar esta clase resultó ser tan difícil (o tan lento) que en la versión 1.1 tuvimos que agregar una nueva clase: java.util.Calendar . Desafortunadamente, la clase Calendar resultó no ser mucho mejor que Date .- Cambiable. Clases como fecha y hora deben ser inmutables.
- Compensaciones. Los años en fecha comienzan desde 1900, los meses en ambas clases comienzan desde cero.
- Nombres. La fecha no es en realidad una "fecha" y el Calendario no es un calendario.
- Formato. El formateo solo funciona con Fecha, no con Calendario, y no es seguro para subprocesos.
Revisar
La nueva API java.time contiene 5 paquetes:- java.time: el paquete base que contiene objetos para almacenar valores
- java.time.chrono: proporciona acceso a diferentes calendarios
- java.time.format: formato y reconocimiento de fecha y hora
- java.time.temporal: bibliotecas de bajo nivel y funcionalidad avanzada
- java.time.zone - clases para trabajar con zonas horarias
fechas
La clase LocalDate es una de las más importantes de la nueva API . Contiene un valor inmutable que representa una fecha. No se puede configurar la hora ni la zona horaria. El nombre "local" puede que le resulte familiar por Joda-Time y originalmente proviene del estándar ISO-8601 . Significa precisamente la ausencia de una zona horaria. Básicamente, LocalDate es una descripción de una fecha, como "5 de abril de 2014". La hora real de esta fecha variará según su zona horaria. Por ejemplo, en Australia esta fecha será 10 horas antes que en Londres y 18 horas antes que en San Francisco. La clase LocalDate tiene todos los métodos comúnmente necesarios:LocalDate date = LocalDate.of(2014, Month.JUNE, 10); int year = date.getYear(); // 2014 Month month = date.getMonth(); // Июнь int dom = date.getDayOfMonth(); // 10 DayOfWeek dow = date.getDayOfWeek(); // Вторник int len = date.lengthOfMonth(); // 30 (дней в Июне) boolean leap = date.isLeapYear(); // false (не високосный год)
en nuestro ejemplo, vemos una fecha creada usando un método de fábrica (todos los constructores son privados). A continuación le pedimos al objeto algunos datos. Tenga en cuenta que
las enumeraciones Month y
DayOfWeek están diseñadas para hacer que el código sea más legible y confiable. En el siguiente ejemplo veremos cómo modificar la fecha. Como la clase es inmutable, el resultado serán nuevos objetos, pero el original permanecerá como estaba.
LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.withYear(2015); // 2015-06-10 date = date.plusMonths(2); // 2015-08-10 date = date.minusDays(1); // 2015-08-09
Estos son cambios relativamente simples, pero a menudo es necesario realizar modificaciones de fecha más complejas. Hay un mecanismo especial para esto en
la API java.time: TemporalAdjuster . Su propósito es proporcionar una herramienta integrada que le permita manipular fechas, por ejemplo obteniendo un objeto correspondiente al último día del mes. Algunos de ellos están incluidos en
la API , pero puedes agregar los tuyos propios. Usar modificadores es muy fácil, pero requiere importaciones estáticas:
import static java.time.DayOfWeek.* import static java.time.temporal.TemporalAdjusters.* LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.with(lastDayOfMonth()); date = date.with(nextOrSame(WEDNESDAY));
el uso de modificadores simplifica enormemente su código. Nadie quiere ver mucha manipulación manual de fechas. Si se produce algún tipo de manipulación de fechas varias veces en su proyecto, escriba su propio modificador y su equipo podrá usarlo como un componente ya escrito y probado.
GO TO FULL VERSION