Clase LocalDateTime de Java
LocalDateTime es una clase importante en la API de fecha y hora introducida en Java 8 (paquete java.time). Representa un objeto de fecha y hora inmutable que no contiene información de zona horaria. Esta clase puede almacenar información de fecha y hora a nivel de año, mes, día, hora, minuto, segundo y nanosegundo.
Características de LocalDateTime
- Inmutabilidad: todas las clases de java.time son inmutables y seguras para hilos
- No contiene zona horaria: solo representa la fecha y hora local
- Precisión de nanosegundos: puede representar el tiempo con precisión de nanosegundos
- API rica: proporciona una gran cantidad de métodos para el cálculo y el formateo de fecha y hora
Crear objetos LocalDateTime
1. Usar método de fábrica estático
Ejemplo
LocalDateTime now = LocalDateTime.now();
// Crear con la fecha y hora especificadas
LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 15, 14, 30, 45);
// Usar año, mes, día, hora, minuto
LocalDateTime dateTime1 = LocalDateTime.of(2023, Month.MAY, 15, 14, 30);
// Usar año, mes, día, hora, minuto, segundo
LocalDateTime dateTime2 = LocalDateTime.of(2023, 5, 15, 14, 30, 45);
// Usar año, mes, día, hora, minuto, segundo, nanosegundo
LocalDateTime dateTime3 = LocalDateTime.of(2023, 5, 15, 14, 30, 45, 100);
2. Combinar desde LocalDate y LocalTime
Ejemplo
LocalTime time = LocalTime.of(14, 30, 45);
LocalDateTime dateTime = LocalDateTime.of(date, time);
3. Parsear cadenas
Ejemplo
Métodos comunes de operación
Obtener las partes de la fecha y hora
Ejemplo
int year = dateTime.getYear();
Month month = dateTime.getMonth(); // Devuelve el enum Month
int monthValue = dateTime.getMonthValue(); // Devuelve 1-12
int day = dateTime.getDayOfMonth();
int hour = dateTime.getHour();
int minute = dateTime.getMinute();
int second = dateTime.getSecond();
int nano = dateTime.getNano();
Cálculo de fecha y hora
Ejemplo
// Operaciones de suma
LocalDateTime plusYears = dateTime.plusYears(1);
LocalDateTime plusMonths = dateTime.plusMonths(1);
LocalDateTime plusDays = dateTime.plusDays(1);
LocalDateTime plusHours = dateTime.plusHours(1);
LocalDateTime plusMinutes = dateTime.plusMinutes(1);
LocalDateTime plusSeconds = dateTime.plusSeconds(1);
// Operaciones de resta
LocalDateTime minusYears = dateTime.minusYears(1);
LocalDateTime minusDays = dateTime.minusDays(1);
// Otras operaciones de resta similares...
Comparación de fecha y hora
Ejemplo
LocalDateTime dateTime2 = LocalDateTime.of(2023, 5, 16, 14, 30);
boolean isBefore = dateTime1.isBefore(dateTime2); // true
boolean isAfter = dateTime1.isAfter(dateTime2); // false
boolean isEqual = dateTime1.isEqual(dateTime2); // false
Ajustar fecha y hora
Ejemplo
// Modificar campos específicos
LocalDateTime withYear = dateTime.withYear(2024);
LocalDateTime withHour = dateTime.withHour(15);
// Otros campos similares...
// Usar TemporalAdjusters
LocalDateTime firstDayOfMonth = dateTime.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime lastDayOfYear = dateTime.with(TemporalAdjusters.lastDayOfYear());
Formateo y análisis
Formatear fecha y hora
Ejemplo
// Usar formato predefinido
DateTimeFormatter isoDateTime = DateTimeFormatter.ISO_DATE_TIME;
String formatted = dateTime.format(isoDateTime);
// Formato personalizado
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String customFormatted = dateTime.format(formatter);
Parsear cadenas como fecha y hora
Ejemplo
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime parsedDateTime = LocalDateTime.parse(str, formatter);
Conversión con otras clases de fecha y hora
Convertir a LocalDate y LocalTime
Ejemplo
LocalDate date = dateTime.toLocalDate();
LocalTime time = dateTime.toLocalTime();
Conversión con Instant y ZonedDateTime
Ejemplo
ZoneId zone = ZoneId.systemDefault();
// LocalDateTime a ZonedDateTime
ZonedDateTime zonedDateTime = dateTime.atZone(zone);
// ZonedDateTime a LocalDateTime
LocalDateTime fromZoned = zonedDateTime.toLocalDateTime();
// LocalDateTime a Instant
Instant instant = zonedDateTime.toInstant();
// Instant a LocalDateTime
LocalDateTime fromInstant = LocalDateTime.ofInstant(instant, zone);
Ejemplos de aplicación práctica
Calcular el intervalo entre dos fechas y horas
Ejemplo
LocalDateTime end = LocalDateTime.of(2023, 5, 16, 17, 30);
Duration duration = Duration.between(start, end);
long hours = duration.toHours(); // 32
long minutes = duration.toMinutes(); // 1950
Comprobar si la fecha está dentro de un rango específico
Ejemplo
LocalDateTime startDate = LocalDateTime.of(2023, 5, 1, 0, 0);
LocalDateTime endDate = LocalDateTime.of(2023, 5, 31, 23, 59);
boolean isInRange = !checkDate.isBefore(startDate) && !checkDate.isAfter(endDate);
Generar una secuencia de fecha y hora
Ejemplo
List<LocalDateTime> dateTimes = new ArrayList<>();
for (int i = 0; i < 10; i++) {
dateTimes.add(start.plusDays(i));
}
Ejemplo integral
Ejemplo
import java.time.format.DateTimeFormatter;
public class LocalDateTimeDemo {
public static void main(String[] args) {
// 1. Obtener la fecha y hora actuales
LocalDateTime now = LocalDateTime.now();
System.out.println("Fecha y hora actuales: " + now);
// 2. Crear una fecha y hora específicas
LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 15, 10, 30, 45);
System.out.println("Fecha y hora específicas: " + specificDateTime);
// 3. Parsear desde una cadena
LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15T10:30:45");
System.out.println("Fecha y hora parseada: " + parsedDateTime);
// 4. Formatear la salida
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(yyyy 'año' MM 'mes' dd 'día' HH:mm:ss);
String formattedDateTime = now.format(formatter);
System.out.println("Fecha y hora formateadas: " + formattedDateTime);
// 5. Obtener cada parte
System.out.println("Año: " + now.getYear());
System.out.println("Mes: " + now.getMonthValue() + " (" + now.getMonth() + ")");
System.out.println("Día: " + now.getDayOfMonth());
System.out.println("Hora: " + now.getHour());
System.out.println("Minuto: " + now.getMinute());
System.out.println("Segundo: " + now.getSecond());
// 6. Operaciones de fecha y hora
LocalDateTime tomorrow = now.plusDays(1);
System.out.println("Mañana a esta hora: " + tomorrow);
LocalDateTime lastWeek = now.minusWeeks(1);
System.out.println("La semana pasada a esta hora: " + lastWeek);
// 7. Comparar fecha y hora
System.out.println("¿Está ahora después de la hora específica? " + now.isAfter(specificDateTime));
System.out.println("¿Está ahora antes de la hora específica? " + now.isBefore(specificDateTime));
}
}
El resultado de salida es:
格式化后的日期时间: 2025年05月01日 11:25:48 年: 2025 月: 5 (MAY) 日: 1 时: 11 分: 25 秒: 48 明天此时: 2025-05-02T11:25:48.651400 上周此时: 2025-04-24T11:25:48.651400 现在是否在特定时间之后: true 现在是否在特定时间之前: false
Conversión de fecha y hora
Ejemplo
public class DateTimeConversion {
public static void main(String[] args) {
// LocalDateTime se convierte a LocalDate y LocalTime
LocalDateTime dateTime = LocalDateTime.now();
LocalDate date = dateTime.toLocalDate();
LocalTime time = dateTime.toLocalTime();
System.out.println("Parte de fecha: " + date);
System.out.println("Parte de hora: " + time);
// Crear LocalDateTime desde LocalDate y LocalTime
LocalDateTime combined = LocalDateTime.of(date, time);
System.out.println("Fecha y hora combinadas: " + combined);
// Conversión con Instant (se requiere zona horaria)
ZoneId zone = ZoneId.of("Asia/Shanghai");
Instant instant = dateTime.atZone(zone).toInstant();
System.out.println("Convertido a Instant: " + instant);
}
}
El resultado de salida es:
日期部分: 2025-05-01 时间部分: 11:27:02.724101 组合后的日期时间: 2025-05-01T11:27:02.724101 转换为Instant: 2025-05-01T03:27:02.724101Z
Resumen
La clase LocalDateTime es una clase muy práctica en la API de fecha y hora de Java 8; proporciona una gran cantidad de métodos para manejar fechas y horas sin zona horaria. Después de estudiar este artículo, deberías haber dominado:
- Cómo crear objetos LocalDateTime
- Cómo realizar cálculos y comparaciones de fecha y hora
- Cómo formatear y analizar fecha y hora
- Cómo convertir con otras clases de fecha y hora
- Algunos escenarios de aplicación práctica
LocalDateTime es muy adecuado para manejar escenarios comerciales que no requieren información de zona horaria, como cumpleaños, horarios de reuniones, etc. Para escenarios que requieren manejo de zona horaria, se debe considerar el uso de la clase ZonedDateTime.
Métodos de fábrica estáticos
| Método | Descripción | Ejemplo |
|---|---|---|
static LocalDateTime now() |
Obtener la fecha y hora actuales | LocalDateTime.now() |
static LocalDateTime of(int year, int month, int day, int hour, int minute) |
Crear especificando año, mes, día, hora y minuto | LocalDateTime.of(2023, 6, 15, 14, 30) |
static LocalDateTime of(int year, int month, int day, int hour, int minute, int second) |
Crear especificando año, mes, día, hora, minuto y segundo | LocalDateTime.of(2023, 6, 15, 14, 30, 45) |
static LocalDateTime of(int year, Month month, int day, int hour, int minute) |
Crear usando el enum Month | LocalDateTime.of(2023, Month.JUNE, 15, 14, 30) |
static LocalDateTime of(LocalDate date, LocalTime time) |
Crear combinando LocalDate y LocalTime | LocalDateTime.of(LocalDate.now(), LocalTime.now()) |
static LocalDateTime parse(CharSequence text) |
Parsear desde una cadena (formato ISO) | LocalDateTime.parse("2023-06-15T14:30:45") |
static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter) |
Parsear usando un formato específico | LocalDateTime.parse("15/06/2023 14:30", DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm")) |
Obtener información de fecha y hora
| Método | Descripción | Ejemplo |
|---|---|---|
int getYear() |
Obtener el año | 2023 |
Month getMonth() |
Obtener el mes (enum Month) | Month.JUNE |
int getMonthValue() |
Obtener el valor del mes (1-12) | 6 |
int getDayOfMonth() |
Obtener el día del mes | 15 |
int getDayOfYear() |
Obtener el día del año | 166 |
DayOfWeek getDayOfWeek() |
Obtener el día de la semana (enum DayOfWeek) | DayOfWeek.THURSDAY |
int getHour() |
Obtener la hora (0-23) | 14 |
int getMinute() |
Obtener minutos (0-59) | 30 |
int getSecond() |
Obtener segundos (0-59) | 45 |
int getNano() |
Obtener nanosegundos | 0 |
Operaciones de fecha y hora
| Método | Descripción | Ejemplo |
|---|---|---|
LocalDateTime plusDays(long days) |
Añadir días | dt.plusDays(5) |
LocalDateTime plusHours(long hours) |
Añadir horas | dt.plusHours(2) |
LocalDateTime plusMinutes(long minutes) |
Añadir minutos | dt.plusMinutes(30) |
LocalDateTime plusSeconds(long seconds) |
Añadir segundos | dt.plusSeconds(45) |
LocalDateTime plusNanos(long nanos) |
Añadir nanosegundos | dt.plusNanos(1000000) |
LocalDateTime minusDays(long days) |
Restar días | dt.minusDays(5) |
LocalDateTime minusHours(long hours) |
Restar horas | dt.minusHours(2) |
LocalDateTime minusMinutes(long minutes) |
Restar minutos | dt.minusMinutes(30) |
LocalDateTime minusSeconds(long seconds) |
Restar segundos | dt.minusSeconds(45) |
LocalDateTime minusNanos(long nanos) |
Restar nanosegundos | dt.minusNanos(1000000) |
LocalDateTime withYear(int year) |
Modificar el año | dt.withYear(2024) |
LocalDateTime withMonth(int month) |
Modificar el mes | dt.withMonth(12) |
LocalDateTime withDayOfMonth(int day) |
Modificar el día del mes | dt.withDayOfMonth(1) |
LocalDateTime withHour(int hour) |
Modificar la hora | dt.withHour(0) |
LocalDateTime withMinute(int minute) |
Modificar los minutos | dt.withMinute(0) |
LocalDateTime withSecond(int second) |
Modificar los segundos | dt.withSecond(0) |
LocalDateTime withNano(int nano) |
Modificar los nanosegundos | dt.withNano(0) |
Comparación de fecha y hora
| Método | Descripción | Ejemplo |
|---|---|---|
boolean isAfter(ChronoLocalDateTime<?> other) |
Si es después de la fecha y hora especificadas | dt1.isAfter(dt2) |
boolean isBefore(ChronoLocalDateTime<?> other) |
Si es antes de la fecha y hora especificadas | dt1.isBefore(dt2) |
boolean isEqual(ChronoLocalDateTime<?> other) |
Si es igual a la fecha y hora especificadas | dt1.isEqual(dt2) |
int compareTo(ChronoLocalDateTime<?> other) |
Comparar dos fechas y horas | dt1.compareTo(dt2) |
Métodos de conversión
| Método | Descripción | Ejemplo |
|---|---|---|
LocalDate toLocalDate() |
Convertir a LocalDate | dt.toLocalDate() |
LocalTime toLocalTime() |
Convertir a LocalTime | dt.toLocalTime() |
Instant toInstant(ZoneOffset offset) |
Convertir a Instant | dt.toInstant(ZoneOffset.UTC) |
ZonedDateTime atZone(ZoneId zone) |
Convertir a ZonedDateTime | dt.atZone(ZoneId.of("Asia/Shanghai")) |
OffsetDateTime atOffset(ZoneOffset offset) |
Convertir a OffsetDateTime | dt.atOffset(ZoneOffset.ofHours(8)) |
Formateo y conversión de cadenas
| Método | Descripción | Ejemplo |
|---|---|---|
String format(DateTimeFormatter formatter) |
Formatear como cadena | dt.format(DateTimeFormatter.ISO_DATE_TIME) |
String toString() |
Convertir a cadena en formato ISO | "2023-06-15T14:30:45" |