Mira la lección en vídeo
Accede al vídeo completo de esta lección y a más contenido exclusivo con el Plan Plus.
Desbloquear Plan PlusLocalDate
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
Guarda tu progreso
Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.
Más de 25.000 desarrolladores ya confían en CertiDevs
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);
Aprendizajes de esta lección de Java
- Comprender qué es LocalDate y su propósito en la API java.time.
- Crear instancias de LocalDate mediante diferentes métodos.
- Obtener y manipular componentes de fechas de forma inmutable.
- Realizar comparaciones y cálculos entre fechas.
- Aplicar LocalDate en ejemplos prácticos como cálculo de edad y generación de calendarios.
Completa este curso de Java y certifícate
Únete a nuestra plataforma de cursos de programación y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.
Asistente IA
Resuelve dudas al instante
Ejercicios
Practica con proyectos reales
Certificados
Valida tus conocimientos
Más de 25.000 desarrolladores ya se han certificado con CertiDevs