Java LocalDate
外观
Java LocalDate 是 Java 日期时间 API(`java.time` 包)中的一个核心类,用于表示不带时间和时区的日期(年-月-日)。它是不可变的(immutable)且线程安全的,适用于处理仅需日期的场景,如生日、节假日或事件日期。
概述[编辑 | 编辑源代码]
`LocalDate` 表示 ISO-8601 日历系统中的日期(默认格式为 `YYYY-MM-DD`),例如 `2023-10-05`。它不包含时间信息(如小时、分钟)或时区偏移量,因此适用于纯日期的计算和比较。
主要特性[编辑 | 编辑源代码]
- 不可变性:所有修改操作返回新实例,原对象不变。
- 线程安全:无需额外同步。
- 链式调用:支持方法链式操作(如 `plusDays().minusMonths()`)。
创建 LocalDate 对象[编辑 | 编辑源代码]
以下是创建 `LocalDate` 实例的常见方式:
当前日期[编辑 | 编辑源代码]
LocalDate today = LocalDate.now();
System.out.println("当前日期: " + today); // 输出示例: 2023-10-05
指定日期[编辑 | 编辑源代码]
LocalDate specificDate = LocalDate.of(2023, 10, 5);
LocalDate parsedDate = LocalDate.parse("2023-10-05"); // 必须符合ISO格式
System.out.println(specificDate); // 输出: 2023-10-05
常用操作[编辑 | 编辑源代码]
获取日期字段[编辑 | 编辑源代码]
LocalDate date = LocalDate.of(2023, 10, 5);
int year = date.getYear(); // 2023
Month month = date.getMonth(); // OCTOBER
int day = date.getDayOfMonth(); // 5
DayOfWeek dow = date.getDayOfWeek();// THURSDAY
日期加减[编辑 | 编辑源代码]
LocalDate tomorrow = today.plusDays(1);
LocalDate nextMonth = today.plusMonths(1);
LocalDate previousYear = today.minusYears(1);
日期比较[编辑 | 编辑源代码]
boolean isAfter = today.isAfter(LocalDate.parse("2023-01-01"));
boolean isLeapYear = today.isLeapYear();
实际应用案例[编辑 | 编辑源代码]
案例1:计算两个日期之间的天数[编辑 | 编辑源代码]
LocalDate start = LocalDate.of(2023, 1, 1);
LocalDate end = LocalDate.of(2023, 10, 5);
long daysBetween = ChronoUnit.DAYS.between(start, end);
System.out.println("相差天数: " + daysBetween); // 输出: 277
案例2:检查节假日[编辑 | 编辑源代码]
LocalDate dateToCheck = LocalDate.of(2023, 12, 25);
if (dateToCheck.getMonth() == Month.DECEMBER && dateToCheck.getDayOfMonth() == 25) {
System.out.println("这是圣诞节!");
}
高级用法[编辑 | 编辑源代码]
自定义日期格式[编辑 | 编辑源代码]
使用 `DateTimeFormatter` 解析或格式化日期:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String formattedDate = today.format(formatter); // 输出: 05/10/2023
LocalDate parsedDate = LocalDate.parse("05/10/2023", formatter);
日期范围检查[编辑 | 编辑源代码]
LocalDate date = LocalDate.of(2023, 2, 30); // 抛出DateTimeException: 无效日期
与其他类的交互[编辑 | 编辑源代码]
转换为 LocalDateTime[编辑 | 编辑源代码]
LocalDateTime dateTime = today.atTime(14, 30); // 2023-10-05T14:30
转换为 ZonedDateTime[编辑 | 编辑源代码]
ZonedDateTime zoned = today.atStartOfDay(ZoneId.of("Europe/Paris"));
性能与最佳实践[编辑 | 编辑源代码]
- 优先使用 `LocalDate` 而非 `java.util.Date` 或 `Calendar`(旧API)。
- 避免频繁创建 `DateTimeFormatter` 实例(可缓存复用)。
总结[编辑 | 编辑源代码]
`LocalDate` 是处理纯日期的理想选择,提供了丰富的操作方法,适合从简单日期计算到复杂业务逻辑的场景。通过结合 `DateTimeFormatter` 和 `ChronoUnit`,可以高效解决大多数日期问题。