Java LocalDate 类

LocalDate 是 Java 8 中引入的一个不可变日期类,属于 java.time 包的一部分。它表示不带时区的日期(年-月-日),例如 "2023-05-15"。LocalDate 不包含时间和时区信息,非常适合处理生日、节假日等只需要日期的场景。


LocalDate 的主要特点

1. 不可变性

LocalDate 实例是不可变的,任何修改操作都会返回一个新的 LocalDate 对象,而不是修改原有对象。

2. 线程安全

由于不可变性,LocalDate 是线程安全的,可以在多线程环境中安全使用。

3. ISO-8601 标准

LocalDate 遵循 ISO-8601 日历系统,这是现代日期和时间表示的国际标准。


创建 LocalDate 对象

1. 获取当前日期

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

2. 使用特定日期创建

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

3. 从字符串解析

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

常用操作方法

1. 获取日期信息

实例

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 (5月的天数)
boolean leap = date.isLeapYear(); // false (2023不是闰年)

2. 日期加减

实例

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. 日期比较

实例

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. 调整日期

实例

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

格式化与解析

1. 格式化日期

实例

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

2. 解析字符串为日期

实例

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

实际应用示例

1. 计算两个日期之间的天数

实例

LocalDate startDate = LocalDate.of(2023, 5, 1);
LocalDate endDate = LocalDate.of(2023, 5, 15);
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
System.out.println("天数差: " + daysBetween);

2. 检查日期是否在范围内

实例

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("日期在范围内");
}

3. 获取某月的所有日期

实例

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

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

总结

LocalDate 类是 Java 8 日期时间 API 的重要组成部分,它提供了丰富的方法来处理日期相关的操作。相比旧的 Date 和 Calendar 类,LocalDate 更加直观、易用且线程安全。掌握 LocalDate 的使用可以大大提高日期处理的效率和代码的可读性。

以下是其常用方法:

静态工厂方法

方法 描述 示例
static LocalDate now() 获取当前日期 LocalDate.now()
static LocalDate of(int year, int month, int dayOfMonth) 指定年月日创建 LocalDate.of(2023, 6, 15)
static LocalDate of(int year, Month month, int dayOfMonth) 指定年月日创建(使用Month枚举) LocalDate.of(2023, Month.JUNE, 15)
static LocalDate parse(CharSequence text) 从字符串解析(ISO格式:yyyy-MM-dd) LocalDate.parse("2023-06-15")
static LocalDate parse(CharSequence text, DateTimeFormatter formatter) 使用指定格式解析 LocalDate.parse("15/06/2023", DateTimeFormatter.ofPattern("dd/MM/yyyy"))

获取日期信息

方法 描述 示例
int getYear() 获取年份 2023
Month getMonth() 获取月份(Month枚举) Month.JUNE
int getMonthValue() 获取月份值(1-12) 6
int getDayOfMonth() 获取月中的天数 15
int getDayOfYear() 获取年中的天数 166
DayOfWeek getDayOfWeek() 获取星期几(DayOfWeek枚举) DayOfWeek.THURSDAY
int lengthOfMonth() 返回月份的天数 30
int lengthOfYear() 返回年份的天数(365或366) 365
boolean isLeapYear() 判断是否是闰年 false

日期操作

方法 描述 示例
LocalDate plusDays(long days) 添加天数 date.plusDays(5)
LocalDate plusWeeks(long weeks) 添加周数 date.plusWeeks(2)
LocalDate plusMonths(long months) 添加月数 date.plusMonths(3)
LocalDate plusYears(long years) 添加年数 date.plusYears(1)
LocalDate minusDays(long days) 减去天数 date.minusDays(5)
LocalDate minusWeeks(long weeks) 减去周数 date.minusWeeks(2)
LocalDate minusMonths(long months) 减去月数 date.minusMonths(3)
LocalDate minusYears(long years) 减去年数 date.minusYears(1)
LocalDate withDayOfMonth(int dayOfMonth) 修改月中的天数 date.withDayOfMonth(1)
LocalDate withDayOfYear(int dayOfYear) 修改年中的天数 date.withDayOfYear(100)
LocalDate withMonth(int month) 修改月份 date.withMonth(12)
LocalDate withYear(int year) 修改年份 date.withYear(2024)

日期比较

方法 描述 示例
boolean isAfter(ChronoLocalDate other) 是否在指定日期之后 date1.isAfter(date2)
boolean isBefore(ChronoLocalDate other) 是否在指定日期之前 date1.isBefore(date2)
boolean isEqual(ChronoLocalDate other) 是否等于指定日期 date1.isEqual(date2)
long until(ChronoLocalDate endDate, ChronoUnit unit) 计算两个日期之间的时间量 date1.until(date2, ChronoUnit.DAYS)

格式化与转换

方法 描述 示例
String format(DateTimeFormatter formatter) 格式化为字符串 date.format(DateTimeFormatter.ISO_DATE)
String toString() 转换为ISO格式字符串(yyyy-MM-dd) "2023-06-15"
long toEpochDay() 转换为从1970-01-01开始的天数 19531
LocalDateTime atTime(int hour, int minute) 转换为LocalDateTime date.atTime(14, 30)
LocalDateTime atTime(LocalTime time) 转换为LocalDateTime date.atTime(LocalTime.now())

其他实用方法

方法 描述 示例
boolean isSupported(ChronoUnit unit) 检查是否支持时间单位 date.isSupported(ChronoUnit.DAYS)
boolean isSupported(ChronoField field) 检查是否支持时间字段 date.isSupported(ChronoField.HOUR_OF_DAY)
LocalDate with(TemporalAdjuster adjuster) 使用调整器调整日期 date.with(TemporalAdjusters.firstDayOfMonth())

Java File Java java.nio.file.Files