36. Trabajar con fechas y la API java.time

La manipulación de fechas y horas es una necesidad común en muchas aplicaciones Java. Desde el lanzamiento de Java 8, la API java.time se ha convertido en la opción estándar para trabajar con fechas y horas de una manera más sencilla y menos propensa a errores. Esta API se inspiró en la biblioteca Joda-Time y es conocida por su diseño fluido e inmutable. Exploremos los aspectos principales de esta API y cómo puede usarla para realizar operaciones de fechas complejas.

Introducción a la API java.time

La API java.time incluye una serie de clases diseñadas para tratar conceptos de tiempo como instantes, duraciones, fechas, horas, zonas horarias y períodos. Las clases son inmutables y seguras para subprocesos, lo que significa que puedes usarlas sin preocupaciones en entornos de subprocesos múltiples.

Clases Fundamentales

  • LocalDate: representa una fecha sin hora ni zona horaria (por ejemplo, 2023-03-15).
  • Hora local: representa una hora sin fecha ni zona horaria (por ejemplo, 10:15:30).
  • LocalDateTime: combina LocalDate y LocalTime, lo que representa una fecha y hora sin zona horaria.
  • ZonedDateTime: Representa una fecha y hora completa con zona horaria.
  • Instantáneo: Representa un momento específico, generalmente utilizado para marcar eventos en las aplicaciones.
  • Duración: Representa una cantidad de tiempo en términos de segundos y nanosegundos.
  • Período: Representa una cantidad de tiempo en términos de años, meses y días.

Manipulación de fechas

La manipulación de la fecha se ve facilitada por las clases LocalDate, LocalTime y LocalDateTime. Puede crear instancias de estas clases utilizando sus métodos de fábrica estáticos, como now(), of() y parse(). Una vez que tenga una instancia, puede modificar sus propiedades usando métodos como plusDays(), minusWeeks(), withYear(), etc. .


Fecha LocalDate = LocalDate.now();
LocalDate mañana = date.plusDays(1);
LocalDate últimoMesSameDía = fecha.minusMeses(1);
Fechalocal en 2025 = fecha.conAño(2025);

Formato y análisis de fechas

El formateo y análisis de fechas los realiza principalmente la clase DateTimeFormatter. Puedes utilizar formateadores predefinidos o crear los tuyos propios para representar fechas y horas según tus necesidades.


Formateador DateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/aaaa");
Cadena formattedDate = fecha.formato(formateador); // "15/03/2023"
LocalDate dateFromString = LocalDate.parse("15/03/2023", formateador);

Trabajar con zonas horarias

La clase ZonedDateTime se utiliza para manejar fechas y horas en diferentes zonas horarias. Puede convertir un LocalDateTime en un ZonedDateTime aplicando una zona horaria específica utilizando el método atZone(). También es posible ajustar un ZonedDateTime a otra zona horaria con el método withZoneSameInstant().


ZoneId newYorkZoneId = ZoneId.of("América/Nueva_York");
ZonedDateTime zonaDateTime = LocalDateTime.now().atZone(newYorkZoneId);
ZonedDateTime ZonedDateTimeInTokyo = ZonedDateTime.withZoneSameInstant(ZoneId.of("Asia/Tokio"));

Comparación de fechas y horas

Comparar fechas y horas es una operación común, y la API java.time ofrece métodos como isBefore(), isAfter() y isEqual() para facilitar estas comparaciones.


booleano esDespués = mañana.isDespués(fecha);
booleano isBefore = últimoMesSameDía.isBefore(fecha);
booleano esEqual = in2025.isEqual(fecha.conAño(2025));

Intervalos de tiempo

Las clases Duración y Period le permiten representar y manipular intervalos de tiempo. Duración se usa para cantidades de tiempo en horas, minutos, segundos y nanosegundos, mientras que Period se usa para días, meses y años.


Duración duración = Duración.entre(Horalocal.MEDIODIA,Horalocal.MIDNIGHT);
Periodo periodo = Periodo.entre(FechaLocal.de(2023, Mes.ENERO, 1), FechaLocal.de(2023, Mes.DICIEMBRE, 31));

API de ajuste temporal

La API java.time también incluye ajustadores temporales que le permiten realizar operaciones complejas de forma concisa. Por ejemplo, puede encontrar el primer día del mes siguiente, el siguiente día hábil o el último día del año utilizando ajustadores temporales.


LocalDate primerDíaDeNextMes = fecha.con(TemporalAdjusters.firstDíaDelSiguienteMes());
LocalDate nextWednesday = date.with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY));
LocalDate último día del año = fecha.with(TemporalAdjusters.lastDayOfYear());

Conclusión

La API java.time es una herramienta potente y flexible para trabajar con fechas y horas en Java. Con su diseño inmutable y seguro para subprocesos, proporciona una manera confiable y eficiente de manejar conceptos temporales complejos en sus aplicaciones. Al dominar esta API, podrá manejar cualquier desafío relacionado con la fecha y la hora con facilidad.

Ahora responde el ejercicio sobre el contenido:

¿Cuál de las siguientes afirmaciones sobre la API `java.time` es cierta?

¡Tienes razón! Felicitaciones, ahora pasa a la página siguiente.

¡Tú error! Inténtalo de nuevo.

Imagen del artículo Internacionalización y localización en Java.

Siguiente página del libro electrónico gratuito:

148Internacionalización y localización en Java.

5 minutos

¡Obtén tu certificado para este curso gratis! descargando la aplicación Cursa y leyendo el libro electrónico allí. ¡Disponible en Google Play o App Store!

Disponible en Google Play Disponible en App Store

+ 6,5 millones
estudiantes

Certificado gratuito y
válido con código QR

48 mil ejercicios
gratis

Calificación de 4.8/5
en tiendas de aplicaciones

Cursos gratuitos de
vídeo, audio y texto.