CodeGym /Cursos /JAVA 25 SELF /LocalDate, LocalTime, LocalDateTime

LocalDate, LocalTime, LocalDateTime

JAVA 25 SELF
Nivel 13 , Lección 2
Disponible

1. LocalDate: fecha sin hora ni zona horaria

LocalDate — es solo una fecha. Sin hora, sin zona horaria, sin complicaciones. Como una página del calendario: 2025-06-01 — y ya está. Si no te importa cuándo exactamente llega «medianoche» en diferentes ciudades, y solo necesitas «1 de junio de 2025», usa LocalDate.

¿Cómo crear LocalDate?

Hay varias maneras, todas sencillas y cómodas.

Fecha actual

import java.time.LocalDate;

LocalDate today = LocalDate.now();
System.out.println(today); // Por ejemplo, 2025-06-01

Fecha concreta

LocalDate birthday = LocalDate.of(1990, 12, 15);
System.out.println(birthday); // 1990-12-15

Se pueden usar números para año, mes y día. El mes es un número del 1 al 12 (enero — 1, diciembre — 12).

Análisis desde una cadena

LocalDate parsedDate = LocalDate.parse("2025-06-01");
System.out.println(parsedDate); // 2025-06-01

La cadena debe estar en el formato yyyy-MM-dd. Si el formato no coincide, se lanzará una excepción.

Obtención de componentes de la fecha

LocalDate tiene métodos que devuelven partes individuales de la fecha:

int year = today.getYear();           // 2025
int month = today.getMonthValue();    // 6 (junio)
int day = today.getDayOfMonth();      // 1
System.out.println("Año: " + year + ", mes: " + month + ", día: " + day);

Si quieres el mes en palabras, usa el método getMonth():

System.out.println(today.getMonth()); // JUNE

Y si necesitas el día de la semana — el método getDayOfWeek():

System.out.println(today.getDayOfWeek()); // SATURDAY

Ejemplo práctico

Seguimos ampliando tu aplicación de consola educativa: ahora puede felicitar al usuario por su cumpleaños.

import java.time.LocalDate;

public class BirthdayApp {
    public static void main(String[] args) {
        LocalDate birthday = LocalDate.of(2000, 2, 29);
        System.out.println("Fecha de nacimiento: " + birthday);
        System.out.println("Día de la semana del nacimiento: " + birthday.getDayOfWeek());
    }
}

2. LocalTime: hora sin fecha ni zona horaria

LocalTime — es solo la hora. Horas, minutos, segundos (e incluso nanosegundos). ¡Pero sin fecha! Si necesitas guardar, por ejemplo, «hora de apertura de la tienda» o «hora de inicio de la reunión» sin vincularlo a una fecha, este es tu clase.

¿Cómo crear LocalTime?

Hora actual

import java.time.LocalTime;

LocalTime now = LocalTime.now();
System.out.println(now); // Por ejemplo, 14:37:12.123456789

Hora concreta

LocalTime lunchTime = LocalTime.of(13, 30); // 13:30:00
System.out.println(lunchTime);

Se pueden añadir segundos y nanosegundos:

LocalTime precise = LocalTime.of(8, 15, 30, 123_000_000); // 08:15:30.123
System.out.println(precise);

Análisis desde una cadena

LocalTime parsedTime = LocalTime.parse("14:30:00");
System.out.println(parsedTime); // 14:30

Obtención de componentes de la hora

int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
System.out.println("Horas: " + hour + ", minutos: " + minute + ", segundos: " + second);

Ejemplo práctico

Añadamos un «reloj» a nuestra aplicación:

import java.time.LocalTime;

public class ClockApp {
    public static void main(String[] args) {
        LocalTime current = LocalTime.now();
        System.out.println("Ahora: " + current);
        System.out.println("Hora: " + current.getHour());
        System.out.println("Minuto: " + current.getMinute());
    }
}

3. LocalDateTime: fecha y hora sin zona horaria

LocalDateTime — es un combo: fecha + hora, pero aún sin zona horaria. Por ejemplo, «2025-06-01 14:30:00». Es útil cuando quieres guardar un momento en el tiempo, pero no te preocupa dónde en el planeta se leerá.

¿Cómo crear LocalDateTime?

Fecha y hora actuales

import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now();
System.out.println(now); // Por ejemplo, 2025-06-01T14:30:15.123456789

Fecha y hora concretas

LocalDateTime meeting = LocalDateTime.of(2025, 6, 1, 14, 30);
System.out.println(meeting); // 2025-06-01T14:30

Se pueden añadir segundos y nanosegundos:

LocalDateTime preciseMeeting = LocalDateTime.of(2025, 6, 1, 14, 30, 45, 123_000_000);
System.out.println(preciseMeeting); // 2025-06-01T14:30:45.123

Análisis desde una cadena

LocalDateTime parsed = LocalDateTime.parse("2025-06-01T14:30:00");
System.out.println(parsed); // 2025-06-01T14:30

Ten en cuenta: la letra T separa la fecha de la hora según el estándar ISO.

Obtención de componentes

int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
System.out.println("Fecha: " + year + "-" + month + "-" + day + " Hora: " + hour + ":" + minute);

4. Operaciones típicas con fecha y hora

Ahora que sabemos crear objetos de fecha y hora, aprendamos a hacer algo útil con ellos.

Suma y resta

Las tres clases (LocalDate, LocalTime, LocalDateTime) son inmutables. Esto significa que métodos como plusDays() o minusMonths() devuelven un objeto nuevo, sin modificar el original.

LocalDate

LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
LocalDate lastMonth = today.minusMonths(1);
System.out.println("Hoy: " + today);
System.out.println("Mañana: " + tomorrow);
System.out.println("Hace un mes: " + lastMonth);

LocalTime

LocalTime now = LocalTime.now();
LocalTime inTenMinutes = now.plusMinutes(10);
System.out.println("Ahora: " + now);
System.out.println("Dentro de 10 minutos: " + inTenMinutes);

LocalDateTime

LocalDateTime start = LocalDateTime.of(2025, 6, 1, 14, 0);
LocalDateTime end = start.plusHours(2).minusMinutes(15);
System.out.println("Inicio: " + start);
System.out.println("Fin: " + end);

Comparación de fechas y horas

Todas las clases tienen los métodos isBefore(), isAfter(), isEqual():

LocalDate birthday = LocalDate.of(2000, 2, 29);
LocalDate today = LocalDate.now();

if (today.isAfter(birthday)) {
    System.out.println("¡Eres mayor que si acabaras de nacer!");
}
LocalTime morning = LocalTime.of(8, 0);
LocalTime now = LocalTime.now();

if (now.isBefore(morning)) {
    System.out.println("Aún es pronto para levantarse...");
} else {
    System.out.println("¡Hora de despertarse!");
}

Obtención de la fecha/hora actual

Como ya has visto, los métodos now() devuelven los valores actuales:

LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();

5. Práctica: ejemplos y ejercicios

Ejemplo 1: Día de la semana para cualquier fecha

import java.time.LocalDate;

public class DayOfWeekApp {
    public static void main(String[] args) {
        LocalDate anyDate = LocalDate.of(2025, 12, 31);
        System.out.println("31 de diciembre de 2025 — es " + anyDate.getDayOfWeek());
    }
}

Ejemplo 2: ¿Cuántos días faltan para Año Nuevo?

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class DaysToNewYear {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        LocalDate newYear = LocalDate.of(today.getYear() + 1, 1, 1);
        long daysLeft = ChronoUnit.DAYS.between(today, newYear);
        System.out.println("¡Faltan " + daysLeft + " días para Año Nuevo!");
    }
}

Ejemplo 3: Comprobar si un año es bisiesto

import java.time.LocalDate;

public class LeapYearCheck {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 1, 1);
        if (date.isLeapYear()) {
            System.out.println(date.getYear() + " — ¡es un año bisiesto!");
        } else {
            System.out.println(date.getYear() + " — es un año no bisiesto.");
        }
    }
}

Ejemplo 4: Diferencia entre dos horas

import java.time.LocalTime;
import java.time.Duration;

public class TimeDifference {
    public static void main(String[] args) {
        LocalTime start = LocalTime.of(9, 0);
        LocalTime end = LocalTime.of(17, 30);
        Duration duration = Duration.between(start, end);
        System.out.println("La jornada laboral dura " + duration.toHours() + " horas " +
                (duration.toMinutes() % 60) + " minutos.");
    }
}

6. Errores típicos

Error n.º 1: confundir LocalDateTime y ZonedDateTime.
LocalDateTime no contiene información sobre la zona horaria. Si guardas horarios de vuelos entre países o eventos que ocurren en distintas zonas, usa ZonedDateTime; de lo contrario, puedes obtener resultados inesperados al transferir datos entre sistemas.

Error n.º 2: usar un formato de cadena incorrecto para el análisis.
Por ejemplo, intentar analizar 01.06.2025 con LocalDate.parse(). Por defecto se espera el formato 2025-06-01. Para otros formatos se necesita un DateTimeFormatter específico (¡sobre esto en la próxima lección!).

Error n.º 3: pensar que métodos como plusDays() modifican el objeto.
¡No! Todos los objetos son inmutables. El método devuelve un objeto nuevo y el antiguo permanece igual.

Error n.º 4: usar LocalTime para almacenar un instante absoluto.
LocalTime es solo para la hora local del día. Si quieres guardar un «momento en el tiempo», usa Instant o ZonedDateTime.

Error n.º 5: olvidar la numeración de los meses (1 — enero, 12 — diciembre).
En LocalDate.of(year, month, day) el mes empieza en 1 (y no en 0, como en algunos otros lenguajes o APIs antiguas).

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION