跳转到内容

Java LocalDate

来自代码酷
Admin留言 | 贡献2025年4月30日 (三) 18:59的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

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` 实例(可缓存复用)。

graph TD A[创建LocalDate] --> B[now/of/parse] B --> C[加减日期] C --> D[比较日期] D --> E[格式化输出]

总结[编辑 | 编辑源代码]

`LocalDate` 是处理纯日期的理想选择,提供了丰富的操作方法,适合从简单日期计算到复杂业务逻辑的场景。通过结合 `DateTimeFormatter` 和 `ChronoUnit`,可以高效解决大多数日期问题。

模板:Java日期时间API