LocalDate和LocalDateTime是Java 8引入的不带时区的日期时间类,分别表示年月日和年月日时分秒,适用于生日、订单时间等场景,提供now()、of()、plus/minus、isBefore/isAfter等方法支持创建、计算和比较操作,通过ChronoUnit可计算日期间隔,配合DateTimeFormatter实现格式化输出,与Date可通过Instant转换,二者均为不可变对象,推荐替代Date和Calendar使用。
Java 8 引入了新的日期时间 API,位于 java.time 包中,其中 LocalDate 和 LocalDateTime 是最常用的类之一。它们用于处理不带时区的日期和日期时间,使用起来简洁且线程安全。
LocalDate 表示一个年月日的组合,比如 2025-04-05,不包含时间或时区信息。适合记录生日、节假日等纯日期场景。
常用方法:示例:
LocalDate today = LocalDate.now(); System.out.println(today); // 输出:2025-04-05 LocalDate birthday = LocalDate.of(1990, 5, 20); boolean isAfter = today.isAfter(birthday); // 判断是否在某个日期之后
LocalDateTime 包含年月日时分秒,精确到纳秒,但依然不带时区。适用于记录事件发生的具体时间点,如订单创建时间。
常用方法:示例:
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // 输出:2025-04-05T10:15:30.123
LocalDateTime meeting = LocalDateTime.of(2025, 4, 10, 9, 0);
String formatted = meeting.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm"));
System.out.println(formatted); // 输出:2025年04月10日 09:00
这两个类都支持直接比较和时间段操作。
LocalDate start = LocalDate.of(2025, 1, 1); LocalDate end = LocalDate.of(2025, 12, 31); long daysBetween = ChronoUnit.DAYS.between(start, end); // 364
如果需要与 Date 或 Calendar 交互,可以通过 Instant 中转。
new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()
Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant())
基本上就这些。LocalDate 和 LocalDateTime 设计清晰,操作直观,推荐在所有新项目中使用它们替代 Date 和 Calendar。注意它们是不可变对象,每次修改都会返回新实例。