Java

Tutorial Java: LocalDate

Aprende a usar LocalDate en Java para gestionar fechas sin hora, manipular y comparar fechas con ejemplos prácticos y claros.

Aprende Java y certifícate

LocalDate

La clase LocalDate es una parte fundamental de la API java.time introducida en Java 8, diseñada específicamente para representar una fecha sin hora en el calendario ISO-8601. Esta clase inmutable ofrece una alternativa moderna y más robusta a las antiguas clases Date y Calendar, resolviendo muchas de sus limitaciones y problemas de diseño.

LocalDate almacena únicamente información de año, mes y día, sin incluir componentes de hora ni zona horaria. Esto la hace ideal para representar fechas como cumpleaños, aniversarios, fechas de vencimiento o cualquier otro concepto donde solo importa el día y no la hora exacta.

Creación de objetos LocalDate

Existen varias formas de crear instancias de LocalDate:

  • Fecha actual:
// Obtiene la fecha actual del sistema
LocalDate hoy = LocalDate.now();
System.out.println("Fecha actual: " + hoy); // Ejemplo: 2023-11-15
  • Fecha específica:
// Crear una fecha específica (año, mes, día)
LocalDate fechaEspecifica = LocalDate.of(2023, 12, 31);
System.out.println("Fecha específica: " + fechaEspecifica); // 2023-12-31

// Alternativa usando Month (enum)
LocalDate navidad = LocalDate.of(2023, Month.DECEMBER, 25);
System.out.println("Navidad: " + navidad); // 2023-12-25
  • Desde texto (parsing):
// Convertir texto a LocalDate
LocalDate fechaParseada = LocalDate.parse("2023-07-15");
System.out.println("Fecha parseada: " + fechaParseada); // 2023-07-15

// Con formato personalizado
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate fechaConFormato = LocalDate.parse("15/07/2023", formatter);
System.out.println("Fecha con formato: " + fechaConFormato); // 2023-07-15

Obtención de componentes de la fecha

LocalDate proporciona métodos para extraer los diferentes componentes de una fecha:

LocalDate fecha = LocalDate.of(2023, 11, 15);

// Obtener componentes individuales
int año = fecha.getYear();           // 2023
int mes = fecha.getMonthValue();     // 11
Month mesEnum = fecha.getMonth();    // NOVEMBER
int dia = fecha.getDayOfMonth();     // 15
DayOfWeek diaSemana = fecha.getDayOfWeek();  // WEDNESDAY
int diaDeLaSemana = fecha.getDayOfWeek().getValue(); // 3 (lunes=1, domingo=7)
int diaDelAño = fecha.getDayOfYear(); // 319

Manipulación de fechas

Una característica clave de LocalDate es su inmutabilidad, lo que significa que cada operación que modifica una fecha devuelve una nueva instancia. Esto evita efectos secundarios no deseados y facilita el trabajo con fechas en entornos concurrentes:

  • Sumar o restar períodos:
LocalDate fecha = LocalDate.of(2023, 11, 15);

// Sumar días, semanas, meses o años
LocalDate mañana = fecha.plusDays(1);
LocalDate siguienteSemana = fecha.plusWeeks(1);
LocalDate siguienteMes = fecha.plusMonths(1);
LocalDate siguienteAño = fecha.plusYears(1);

// Restar períodos
LocalDate ayer = fecha.minusDays(1);
LocalDate semanaAnterior = fecha.minusWeeks(1);
LocalDate mesAnterior = fecha.minusMonths(1);
LocalDate añoAnterior = fecha.minusYears(1);
  • Método plus/minus genérico:
// Usando Period para representar un intervalo de tiempo
Period periodo = Period.of(1, 2, 3); // 1 año, 2 meses, 3 días
LocalDate nuevaFecha = fecha.plus(periodo); // 2025-01-18

// Usando ChronoUnit para unidades específicas
LocalDate tresMesesDespues = fecha.plus(3, ChronoUnit.MONTHS); // 2024-02-15

Ajustadores de fechas

Los ajustadores temporales (TemporalAdjusters) permiten realizar operaciones más complejas sobre fechas:

LocalDate fecha = LocalDate.of(2023, 11, 15);

// Primer día del mes
LocalDate primerDia = fecha.with(TemporalAdjusters.firstDayOfMonth()); // 2023-11-01

// Último día del mes
LocalDate ultimoDia = fecha.with(TemporalAdjusters.lastDayOfMonth()); // 2023-11-30

// Próximo lunes
LocalDate proximoLunes = fecha.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); // 2023-11-20

// Día específico del mes
LocalDate dia15 = fecha.withDayOfMonth(15); // 2023-11-15

// Cambiar mes y año
LocalDate navidad = fecha.withMonth(12).withDayOfMonth(25); // 2023-12-25

Comparación de fechas

LocalDate implementa la interfaz Comparable, lo que permite comparar fechas fácilmente:

LocalDate fecha1 = LocalDate.of(2023, 11, 15);
LocalDate fecha2 = LocalDate.of(2023, 12, 25);

// Comparación con métodos específicos
boolean esAntes = fecha1.isBefore(fecha2);      // true
boolean esDespues = fecha1.isAfter(fecha2);     // false
boolean esIgual = fecha1.isEqual(fecha2);       // false

// Comparación con compareTo
int resultado = fecha1.compareTo(fecha2);       // negativo (-1) porque fecha1 es anterior

Cálculo de períodos entre fechas

Para calcular la diferencia entre dos fechas, podemos usar Period o ChronoUnit:

LocalDate inicio = LocalDate.of(2023, 1, 1);
LocalDate fin = LocalDate.of(2023, 12, 31);

// Usando Period
Period periodo = Period.between(inicio, fin);
System.out.println("Período: " + periodo.getYears() + " años, " + 
                   periodo.getMonths() + " meses, " + 
                   periodo.getDays() + " días"); // 0 años, 11 meses, 30 días

// Usando ChronoUnit para unidades específicas
long dias = ChronoUnit.DAYS.between(inicio, fin);  // 364
long meses = ChronoUnit.MONTHS.between(inicio, fin); // 11
long años = ChronoUnit.YEARS.between(inicio, fin);  // 0

Verificación de fechas especiales

LocalDate proporciona métodos útiles para verificar características de una fecha:

LocalDate fecha = LocalDate.of(2024, 2, 29);

// Verificar si el año es bisiesto
boolean esBisiesto = fecha.isLeapYear(); // true para 2024

// Verificar longitud del mes
int diasEnMes = fecha.lengthOfMonth(); // 29 para febrero en año bisiesto
int diasEnAño = fecha.lengthOfYear();  // 366 para año bisiesto

Ejemplo práctico: Calculadora de edad

Un uso común de LocalDate es calcular la edad de una persona:

public static int calcularEdad(LocalDate fechaNacimiento) {
    LocalDate hoy = LocalDate.now();
    return (int) ChronoUnit.YEARS.between(fechaNacimiento, hoy);
}

// Uso
LocalDate fechaNacimiento = LocalDate.of(1990, 5, 15);
int edad = calcularEdad(fechaNacimiento);
System.out.println("Edad: " + edad + " años");

Ejemplo práctico: Verificar días laborables

Podemos usar LocalDate para determinar si una fecha es un día laborable:

public static boolean esDiaLaborable(LocalDate fecha) {
    // Asumimos que los días laborables son de lunes a viernes
    DayOfWeek diaSemana = fecha.getDayOfWeek();
    return diaSemana != DayOfWeek.SATURDAY && diaSemana != DayOfWeek.SUNDAY;
}

// Uso
LocalDate fecha = LocalDate.of(2023, 11, 15); // Miércoles
System.out.println("¿Es día laborable? " + esDiaLaborable(fecha)); // true

Ejemplo práctico: Calendario mensual

Podemos generar un calendario mensual simple utilizando LocalDate:

public static void imprimirCalendarioMensual(int año, int mes) {
    LocalDate fecha = LocalDate.of(año, mes, 1);
    int diasEnMes = fecha.lengthOfMonth();
    
    System.out.println("Calendario para " + fecha.getMonth() + " " + año);
    System.out.println("Lu Ma Mi Ju Vi Sa Do");
    
    // Ajustar el primer día de la semana (1 = lunes, ... 7 = domingo)
    int diaSemana = fecha.getDayOfWeek().getValue();
    
    // Imprimir espacios para alinear el primer día
    for (int i = 1; i < diaSemana; i++) {
        System.out.print("   ");
    }
    
    // Imprimir los días del mes
    for (int dia = 1; dia <= diasEnMes; dia++) {
        System.out.printf("%2d ", dia);
        
        // Salto de línea después del domingo
        if ((dia + diaSemana - 1) % 7 == 0 || dia == diasEnMes) {
            System.out.println();
        }
    }
}

// Uso
imprimirCalendarioMensual(2023, 11);
Aprende Java online

Otras lecciones de Java

Accede a todas las lecciones de Java y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a Java y certifícate

Ejercicios de programación de Java

Evalúa tus conocimientos de esta lección LocalDate con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Certificados de superación de Java

Supera todos los ejercicios de programación del curso de Java y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.