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
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 nextWeek = today.plusWeeks(1);
LocalDate nextMonth = today.plusMonths(1);
LocalDate nextYear = today.plusYears(1);
LocalDate yesterday = today.minusDays(1);
3. Comparar fechas
Ejemplo
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 firstDayOfMonth = date.withDayOfMonth(1);
LocalDate lastDayOfYear = date.with(TemporalAdjusters.lastDayOfYear());
Formateo y análisis
1. Formatear fecha
Ejemplo
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formattedDate = date.format(formatter);
2. Analizar cadena como fecha
Ejemplo
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 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 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
int daysInMonth = date.lengthOfMonth();
for (int i = 1; i <= daysInMonth; i++) {
System.out.println(date.withDayOfMonth(i));
}
Ejemplo completo
Ejemplo
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 java.nio.file.Files