17370845950

如何使用Java的LocalDate与LocalDateTime类
LocalDate和LocalDateTime是Java 8引入的不带时区的日期时间类,分别表示年月日和年月日时分秒,适用于生日、订单时间等场景,提供now()、of()、plus/minus、isBefore/isAfter等方法支持创建、计算和比较操作,通过ChronoUnit可计算日期间隔,配合DateTimeFormatter实现格式化输出,与Date可通过Instant转换,二者均为不可变对象,推荐替代Date和Calendar使用。

Java 8 引入了新的日期时间 API,位于 java.time 包中,其中 LocalDateLocalDateTime 是最常用的类之一。它们用于处理不带时区的日期和日期时间,使用起来简洁且线程安全。

LocalDate:只表示日期

LocalDate 表示一个年月日的组合,比如 2025-04-05,不包含时间或时区信息。适合记录生日、节假日等纯日期场景。

常用方法:
  • LocalDate.now():获取当前系统日期
  • LocalDate.of(2025, 4, 5):创建指定年月日的日期
  • date.plusDays(3):增加3天(返回新对象)
  • date.minusMonths(1):减去一个月
  • date.getDayOfWeek():获取星期几(如 MONDAY)
  • date.getYear():获取年份

示例:

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 包含年月日时分秒,精确到纳秒,但依然不带时区。适用于记录事件发生的具体时间点,如订单创建时间。

常用方法:
  • LocalDateTime.now():获取当前日期时间
  • LocalDateTime.of(2025, 4, 5, 14, 30):创建指定日期时间
  • dateTime.plusHours(2):增加2小时
  • dateTime.withMinute(0):设置分钟为0
  • dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")):格式化输出

示例:

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

日期比较与计算

这两个类都支持直接比较和时间段操作。

  • isBefore()isAfter()isEqual() 可用于判断日期前后关系
  • 使用 ChronoUnit 计算间隔,例如:
LocalDate start = LocalDate.of(2025, 1, 1);
LocalDate end = LocalDate.of(2025, 12, 31);
long daysBetween = ChronoUnit.DAYS.between(start, end); // 364

与旧日期类型的转换

如果需要与 DateCalendar 交互,可以通过 Instant 中转。

  • Date 转 LocalDateTime: new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()
  • LocalDateTime 转 Date: Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant())

基本上就这些。LocalDate 和 LocalDateTime 设计清晰,操作直观,推荐在所有新项目中使用它们替代 Date 和 Calendar。注意它们是不可变对象,每次修改都会返回新实例。