Introducción al trabajo con fechas y horas en Java
Trabajar con fechas y horas es una de las tareas clave en el desarrollo de cualquier aplicación. Ya sea para registro de eventos, cálculo de plazos de entrega, trabajo con horarios o análisis de datos — no se puede prescindir de entender cómo Java gestiona los objetos temporales. En este artículo, analizaremos todos los aspectos principales: desde la API antigua (Date y Calendar) hasta el paquete moderno java.time (Java 8+). Aprenderás a crear, formatear, comparar y calcular la diferencia entre fechas.
1. API antigua: Date y Calendar
Antes de Java 8, las clases principales para trabajar con fechas eran java.util.Date y java.util.Calendar. Todavía se encuentran en código heredado, por lo que es importante entender sus capacidades básicas y limitaciones.
1.1 Clase Date
Date representa un momento específico en el tiempo con precisión de milisegundos. Sin embargo, tiene muchas desventajas: es mutable (inseguro en aplicaciones multiproceso) y tiene poco soporte para internacionalización.
import java.util.Date;
public class DateExample { public static void main(String[] args) { // Fecha y hora actuales Date now = new Date(); System.out.println("Fecha actual: " + now);
// Forma obsoleta de obtener el año (1900 + ...) int year = now.getYear() + 1900; System.out.println("Año: " + year); }}1.2 Clase Calendar
Calendar es una clase más flexible pero engorrosa. Permite manipular componentes individuales de la fecha (año, mes, día).
import java.util.Calendar;
public class CalendarExample { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); System.out.println("Hora actual: " + cal.getTime());
// Establecer una fecha específica cal.set(2025, Calendar.MARCH, 15); System.out.println("Fecha establecida: " + cal.getTime());
// Añadir 7 días cal.add(Calendar.DAY_OF_MONTH, 7); System.out.println("En una semana: " + cal.getTime()); }}Desventajas: numeración de meses desde 0 (enero = 0), mutabilidad, falta de formateo simple.
2. Nueva API: java.time (Java 8+)
A partir de Java 8, se añadió a la biblioteca estándar el paquete java.time, basado en las ideas de la biblioteca Joda-Time. Está compuesto por clases inmutables, lo que hace que el código sea seguro y predecible.
2.1 LocalDate — solo fecha
LocalDate representa una fecha sin hora (año, mes, día). Ideal para cumpleaños, calendarios.
import java.time.LocalDate;import java.time.Month;
public class LocalDateExample { public static void main(String[] args) { // Fecha actual LocalDate today = LocalDate.now(); System.out.println("Hoy: " + today);
// Fecha específica LocalDate specificDate = LocalDate.of(2025, Month.DECEMBER, 31); System.out.println("Año nuevo: " + specificDate);
// Sumar/restar días LocalDate nextWeek = today.plusDays(7); System.out.println("En una semana: " + nextWeek); }}2.2 LocalTime — solo hora
LocalTime almacena la hora (horas, minutos, segundos, nanosegundos) sin vincularla a una fecha.
import java.time.LocalTime;
public class LocalTimeExample { public static void main(String[] args) { LocalTime now = LocalTime.now(); System.out.println("Hora actual: " + now);
LocalTime meeting = LocalTime.of(14, 30); System.out.println("Reunión a las: " + meeting);
// Comparación de horas if (now.isAfter(meeting)) { System.out.println("La reunión ya pasó"); } }}<