Clase Java LocalDate

LocalDate es una clase de fecha inmutable introducida en Java 8, que pertenecejava.timea la parte del paquete.

LocalDate representa una fecha sin zona horaria (año-mes-día), por ejemplo, "2023-05-15". LocalDate no contiene información de hora ni zona horaria, por lo que es muy adecuado para manejar escenarios como cumpleaños, días festivos y otros que solo requieren la fecha.


Características principales de LocalDate

1. Inmutabilidad

Las instancias de LocalDate son inmutables; cualquier operación de modificación devuelve un nuevo objeto LocalDate en lugar de modificar el objeto original.

2. Seguridad para hilos

Debido a la inmutabilidad, LocalDate es seguro para hilos y puede usarse de manera segura en entornos multiproceso.

3. Estándar ISO-8601

LocalDate sigue el sistema de calendario ISO-8601, que es el estándar internacional para la representación moderna de fecha y hora.


Crear objetos LocalDate

1. Obtener la fecha actual

LocalDate today = LocalDate.now();
System.out.println("今天的日期: " + today);

2. Crear con una fecha específica

LocalDate specificDate = LocalDate.of(2023, Month.MAY, 15);
// 或者
LocalDate specificDate2 = LocalDate.of(2023, 5, 15);

3. Analizar desde una cadena

LocalDate parsedDate = LocalDate.parse("2023-05-15");

Métodos de operación comunes

1. Obtener información de la fecha

Ejemplo

LocalDate date = LocalDate.of(2023, 5, 15);
int year = date.getYear();        // 2023
Month month = date.getMonth();    // MAY
int day = date.getDayOfMonth();   // 15
DayOfWeek dow = date.getDayOfWeek(); // MONDAY
int len = date.lengthOfMonth();   // 31 (días de mayo)
boolean leap = date.isLeapYear(); // false (2023 no es bisiesto)

2. Sumar y restar fechas

Ejemplo

LocalDate tomorrow = today.plusDays(1);
LocalDate nextWeek = today.plusWeeks(1);
LocalDate nextMonth = today.plusMonths(1);
LocalDate nextYear = today.plusYears(1);
LocalDate yesterday = today.minusDays(1);

3. Comparar fechas

Ejemplo

LocalDate date1 = LocalDate.of(2023, 5, 15);
LocalDate date2 = LocalDate.of(2023, 6, 20);

boolean isBefore = date1.isBefore(date2); // true
boolean isAfter = date1.isAfter(date2);   // false
boolean isEqual = date1.isEqual(date2);   // false

4. Ajustar fechas

Ejemplo

LocalDate date = LocalDate.of(2023, 5, 15);
LocalDate firstDayOfMonth = date.withDayOfMonth(1);
LocalDate lastDayOfYear = date.with(TemporalAdjusters.lastDayOfYear());

Formateo y análisis

1. Formatear fecha

Ejemplo

LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formattedDate = date.format(formatter);

2. Analizar cadena como fecha

Ejemplo

String dateStr = "2023/05/15";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate date = LocalDate.parse(dateStr, formatter);

Ejemplos de aplicación práctica

1. Calcular los días entre dos fechas

Ejemplo

LocalDate startDate = LocalDate.of(2023, 5, 1);
LocalDate endDate = LocalDate.of(2023, 5, 15);
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
System.out.println("Diferencia de días: " + daysBetween);

2. Comprobar si la fecha está en un rango

Ejemplo

LocalDate dateToCheck = LocalDate.of(2023, 5, 10);
LocalDate startDate = LocalDate.of(2023, 5, 1);
LocalDate endDate = LocalDate.of(2023, 5, 31);
if (dateToCheck.isAfter(startDate) && dateToCheck.isBefore(endDate)) {
    System.out.println("La fecha está dentro del rango");
}

3. Obtener todas las fechas de un mes

Ejemplo

LocalDate date = LocalDate.of(2023, 5, 1);
int daysInMonth = date.lengthOfMonth();

for (int i = 1; i <= daysInMonth; i++) {
    System.out.println(date.withDayOfMonth(i));
}

Ejemplo completo

Ejemplo

import java.time.LocalDate;
import java.time.Month;
import java.time.DayOfWeek;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Locale;

public class LocalDateDemo {

    public static void main(String[] args) {
        // 1. Crear instancias LocalDate
        System.out.println("=== Crear instancias LocalDate ===");
        LocalDate today = LocalDate.now();
        LocalDate specificDate = LocalDate.of(2023, Month.JULY, 15);
        LocalDate parsedDate = LocalDate.parse("2023-08-20");
       
        System.out.println("Fecha actual: " + today);
        System.out.println("Fecha específica: " + specificDate);
        System.out.println("Fecha analizada: " + parsedDate);

        // 2. Obtener información de la fecha
        System.out.println("\n=== Obtener información de la fecha ===);
        System.out.println("Año: " + today.getYear());
        System.out.println("Mes: " + today.getMonth() + " (" + today.getMonthValue() + ")");
        System.out.println("Día: " + today.getDayOfMonth());
        System.out.println("Día de la semana: " + today.getDayOfWeek());
        System.out.println("Día del año: " + today.getDayOfYear());
        System.out.println("Días del mes: " + today.lengthOfMonth());
        System.out.println("Días del año: " + today.lengthOfYear());
        System.out.println("¿Es bisiesto? " + today.isLeapYear());

        // 3. Cálculo de fechas
        System.out.println("\n=== Cálculo de fechas ===);
        System.out.println("Más 5 días: " + today.plusDays(5));
        System.out.println("Más 2 semanas: " + today.plusWeeks(2));
        System.out.println("Más 3 meses: " + today.plusMonths(3));
        System.out.println("Menos 1 año: " + today.minusYears(1));
       
        System.out.println("Primer día del próximo mes: " + today.plusMonths(1).withDayOfMonth(1));
        System.out.println("Último día de este mes: " + today.withDayOfMonth(today.lengthOfMonth()));

        // 4. Comparación de fechas
        System.out.println("\n=== Comparación de fechas ===);
        LocalDate date1 = LocalDate.of(2023, 6, 15);
        LocalDate date2 = LocalDate.of(2023, 6, 20);
       
        System.out.println(date1 + " está antes de " + date2 + "? " + date1.isBefore(date2));
        System.out.println(date1 + " está después de " + date2 + "? " + date1.isAfter(date2));
        System.out.println(date1 + " es igual a " + date2 + "? " + date1.isEqual(date2));
       
        // 5. Calcular la diferencia de fechas
        System.out.println("\n=== Calcular la diferencia de fechas ===);
        LocalDate startDate = LocalDate.of(2023, 1, 1);
        LocalDate endDate = LocalDate.of(2023, 12, 31);
       
        System.out.println("Días entre las dos fechas: " + ChronoUnit.DAYS.between(startDate, endDate));
        System.out.println("Meses entre las dos fechas: " + ChronoUnit.MONTHS.between(startDate, endDate));
        System.out.println("Años entre las dos fechas: " + ChronoUnit.YEARS.between(startDate, endDate));

        // 6. Formateo de fechas
        System.out.println("\n=== Formateo de fechas ===);
        DateTimeFormatter basicFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        DateTimeFormatter chineseFormatter = DateTimeFormatter.ofPattern("yyyy 'año' MM 'mes' dd 'día' EEEE", Locale.CHINA);
        DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US);
       
        System.out.println("Formato básico: " + today.format(basicFormatter));
        System.out.println("Formato chino: " + today.format(chineseFormatter));
        System.out.println("Formato inglés: " + today.format(customFormatter));

        // 7. Otros métodos útiles
        System.out.println("\n=== Otros métodos útiles ===);
        System.out.println("Ajustar al próximo lunes: " + today.with(DayOfWeek.MONDAY));
        System.out.println("¿Es fin de semana? " +
            (today.getDayOfWeek() == DayOfWeek.SATURDAY || today.getDayOfWeek() == DayOfWeek.SUNDAY));
       
        // 8. Iteración de rango de fechas
        System.out.println("\n=== Iteración de rango de fechas ===);
        System.out.println("Fechas de los próximos 7 días:");
        today.datesUntil(today.plusDays(7))
             .forEach(System.out::println);
    }
}

La salida es similar a lo siguiente:

=== 创建 LocalDate 实例 ===
当前日期: 2023-06-15
特定日期: 2023-07-15
解析日期: 2023-08-20

=== 获取日期信息 ===
年: 2023
月: JUNE (6)
日: 15
星期: THURSDAY
一年中的第几天: 166
月份天数: 30
年份天数: 365
是否闰年: false

=== 日期计算 ===
加5天: 2023-06-20
加2周: 2023-06-29
加3个月: 2023-09-15
减1年: 2022-06-15
下个月的第一天: 2023-07-01
本月的最后一天: 2023-06-30

=== 日期比较 ===
2023-06-15 在 2023-06-20 之前? true
2023-06-15 在 2023-06-20 之后? false
2023-06-15 等于 2023-06-20? false

=== 计算日期差 ===
两个日期之间的天数: 364
两个日期之间的月数: 11
两个日期之间的年数: 0

=== 日期格式化 ===
基本格式: 2023/06/15
中文格式: 2023年06月15日 星期四
英文格式: Jun 15, 2023

=== 其他实用方法 ===
调整到下个星期一: 2023-06-19
是否是周末: false

=== 日期范围迭代 ===
接下来7天的日期:
2023-06-15
2023-06-16
2023-06-17
2023-06-18
2023-06-19
2023-06-20
2023-06-21

Resumen

La clase LocalDate es un componente importante de la API de fecha y hora de Java 8; proporciona una gran cantidad de métodos para manejar operaciones relacionadas con fechas. En comparación con las antiguas clases Date y Calendar, LocalDate es más intuitiva, fácil de usar y segura para hilos. Dominar el uso de LocalDate puede mejorar en gran medida la eficiencia del manejo de fechas y la legibilidad del código.

A continuación se presentan sus métodos más utilizados:

Métodos de fábrica estáticos

Método Descripción Ejemplo
static LocalDate now() Obtener la fecha actual LocalDate.now()
static LocalDate of(int year, int month, int dayOfMonth) Crear con año, mes y día específicos LocalDate.of(2023, 6, 15)
static LocalDate of(int year, Month month, int dayOfMonth) Crear con año, mes y día específicos (usando el enum Month) LocalDate.of(2023, Month.JUNE, 15)
static LocalDate parse(CharSequence text) Analizar desde una cadena (formato ISO: yyyy-MM-dd) LocalDate.parse("2023-06-15")
static LocalDate parse(CharSequence text, DateTimeFormatter formatter) Analizar con un formato específico LocalDate.parse("15/06/2023", DateTimeFormatter.ofPattern("dd/MM/yyyy"))

Obtener información de la fecha

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 lengthOfMonth() Devuelve el número de días del mes 30
int lengthOfYear() Devuelve el número de días del año (365 o 366) 365
boolean isLeapYear() Determina si es un año bisiesto false

Operaciones de fecha

Método Descripción Ejemplo
LocalDate plusDays(long days) Agregar días date.plusDays(5)
LocalDate plusWeeks(long weeks) Agregar semanas date.plusWeeks(2)
LocalDate plusMonths(long months) Agregar meses date.plusMonths(3)
LocalDate plusYears(long years) Agregar años date.plusYears(1)
LocalDate minusDays(long days) Restar días date.minusDays(5)
LocalDate minusWeeks(long weeks) Restar semanas date.minusWeeks(2)
LocalDate minusMonths(long months) Restar meses date.minusMonths(3)
LocalDate minusYears(long years) Restar años date.minusYears(1)
LocalDate withDayOfMonth(int dayOfMonth) Modificar el día del mes date.withDayOfMonth(1)
LocalDate withDayOfYear(int dayOfYear) Modificar el día del año date.withDayOfYear(100)
LocalDate withMonth(int month) Modificar el mes date.withMonth(12)
LocalDate withYear(int year) Modificar el año date.withYear(2024)

Comparación de fechas

Método Descripción Ejemplo
boolean isAfter(ChronoLocalDate other) Si es después de la fecha especificada date1.isAfter(date2)
boolean isBefore(ChronoLocalDate other) Si es antes de la fecha especificada date1.isBefore(date2)
boolean isEqual(ChronoLocalDate other) Si es igual a la fecha especificada date1.isEqual(date2)
long until(ChronoLocalDate endDate, ChronoUnit unit) Calcula la cantidad de tiempo entre dos fechas date1.until(date2, ChronoUnit.DAYS)

Formateo y conversión

Método Descripción Ejemplo
String format(DateTimeFormatter formatter) Formatear como cadena date.format(DateTimeFormatter.ISO_DATE)
String toString() Convertir a cadena en formato ISO (yyyy-MM-dd) "2023-06-15"
long toEpochDay() Convertir al número de días desde 1970-01-01 19531
LocalDateTime atTime(int hour, int minute) Convertir a LocalDateTime date.atTime(14, 30)
LocalDateTime atTime(LocalTime time) Convertir a LocalDateTime date.atTime(LocalTime.now())

Otros métodos útiles

Método Descripción Ejemplo
boolean isSupported(ChronoUnit unit) Comprobar si se admite la unidad de tiempo date.isSupported(ChronoUnit.DAYS)
boolean isSupported(ChronoField field) Comprobar si se admite el campo de tiempo date.isSupported(ChronoField.HOUR_OF_DAY)
LocalDate with(TemporalAdjuster adjuster) Ajustar la fecha usando un ajustador date.with(TemporalAdjusters.firstDayOfMonth())

Java File Java java.nio.file.Files

Otras extensiones