Introducción al trabajo con fechas y horas en Java
Trabajar con fechas y horas es una de las tareas más comunes en el desarrollo de aplicaciones. Java proporciona herramientas potentes para este propósito. Durante mucho tiempo, la clase principal fue java.util.Date, pero tenía serias desventajas: mutabilidad, confusión con los meses (comenzando desde 0) y falta de soporte para zonas horarias. Con el lanzamiento de Java 8, la situación cambió drásticamente: apareció una nueva Date/Time API (paquete java.time), que es thread-safe, inmutable e intuitiva. En este artículo, analizaremos ambos enfoques, pero nos centraremos principalmente en la API moderna.
1. Legacy API: Date y Calendar
Aunque no se recomienda usar las clases antiguas en código nuevo, es posible que te encuentres con ellas en proyectos heredados. Veamos los puntos principales.
Clase Date
La clase java.util.Date representa un momento específico en el tiempo con precisión de milisegundos. Tiene muchos métodos obsoletos.
import java.util.Date;
public class LegacyDateExample { public static void main(String[] args) { // Fecha y hora actual Date now = new Date(); System.out.println("Fecha actual: " + now);
// Fecha por milisegundos (desde el 1 de enero de 1970) Date specificDate = new Date(1000000000000L); System.out.println("Fecha por timestamp: " + specificDate);
// Comparación de fechas Date earlier = new Date(0); boolean isBefore = earlier.before(now); // true System.out.println("¿Es anterior? " + isBefore); }}Clase Calendar
java.util.Calendar es una herramienta más flexible, pero engorrosa. Permite manipular los campos de la fecha.
import java.util.Calendar;
public class CalendarExample { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // Establecer una fecha específica: 25 de diciembre de 2024 cal.set(2024, Calendar.DECEMBER, 25, 10, 30, 0); System.out.println("Fecha: " + cal.getTime());
// Añadir 2 semanas cal.add(Calendar.WEEK_OF_YEAR, 2); System.out.println("Dentro de 2 semanas: " + cal.getTime());
// Obtener campos individuales int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); int month = cal.get(Calendar.MONTH) + 1; // +1, ya que enero = 0 System.out.println("Día: " + dayOfMonth + ", Mes: " + month); }}Desventajas: mutabilidad (el método add modifica el objeto original), complejidad de formato, confusión con las zonas horarias.
2. Date/Time API moderna (Java 8+)
El paquete java.time incluye clases clave: LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant y otras. Todas son inmutables y thread-safe.
LocalDate — trabajo con fechas
Almacena una fecha sin hora ni zona horaria (año, mes, día).
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 newYear = LocalDate.of(2025, Month.JANUARY, 1); System.out.println("Año Nuevo: " + newYear);
// Aritmética de fechas LocalDate nextWeek = today.plusWeeks(1); LocalDate lastMonth = today.minusMonths(1); System.out.println("En una semana: " + nextWeek); System.out.println("Hace un mes: " + lastMonth);
// Comparación boolean isAfter = today.isAfter(newYear); // false System.out.println("¿Hoy es después de Año Nuevo? " + isAfter); }}LocalTime — trabajo con horas
Almacena la hora (hora, minuto, segundo, nanosegundo) sin fecha ni zona horaria.
```