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

  1. Inmutabilidad: todas las clases de java.time son inmutables y seguras para hilos
  2. No contiene zona horaria: solo representa la fecha y hora local
  3. Precisión de nanosegundos: puede representar el tiempo con precisión de nanosegundos
  4. 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

// Obtener la fecha y hora actuales
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

LocalDate date = LocalDate.of(2023, 5, 15);
LocalTime time = LocalTime.of(14, 30, 45);
LocalDateTime dateTime = LocalDateTime.of(date, time);

3. Parsear cadenas

Ejemplo

LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15T14:30:45");

Métodos comunes de operación

Obtener las partes de la fecha y hora

Ejemplo

LocalDateTime dateTime = LocalDateTime.now();

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

LocalDateTime dateTime = LocalDateTime.now();

// 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 dateTime1 = LocalDateTime.of(2023, 5, 15, 14, 30);
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

LocalDateTime dateTime = LocalDateTime.now();

// 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

LocalDateTime dateTime = LocalDateTime.now();

// 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

String str = "2023-05-15 14:30:45";
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

LocalDateTime dateTime = LocalDateTime.now();

LocalDate date = dateTime.toLocalDate();
LocalTime time = dateTime.toLocalTime();

Conversión con Instant y ZonedDateTime

Ejemplo

// Se requiere información de zona horaria
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 start = LocalDateTime.of(2023, 5, 15, 9, 0);
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 checkDate = LocalDateTime.of(2023, 5, 15, 14, 0);
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

LocalDateTime start = LocalDateTime.of(2023, 5, 1, 9, 0);
List<LocalDateTime> dateTimes = new ArrayList<>();

for (int i = 0; i < 10; i++) {
    dateTimes.add(start.plusDays(i));
}

Ejemplo integral

Ejemplo

import java.time.LocalDateTime;
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

import java.time.*;

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:

  1. Cómo crear objetos LocalDateTime
  2. Cómo realizar cálculos y comparaciones de fecha y hora
  3. Cómo formatear y analizar fecha y hora
  4. Cómo convertir con otras clases de fecha y hora
  5. 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"
Otras extensiones