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).
GO TO FULL VERSION