TemporalAdjusters与TemporalAdjuster的作用在于提供了一种统一的、类型安全的方式来处理日期时间的操作。在过去的版本中,Java的日期时间API主要依赖于Calendar类,但这个类在处理复杂的日期时间操作时显得不够灵活和类型安全。TemporalAdjusters的出现弥补了这一缺陷,使得日期时间操作更加简洁、易用和类型安全。
先记录一个Date与LocalDateTime的互转:
//正常的Date转LocalDateTime
LocalDateTime statusLocalDateTime = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
//LocalDateTime转LocalDate
LocalDate localDate = statusLocalDateTime.toLocalDate();
TemporalAdjuster
TemporalAdjuster是Java 8中引入的新的日期时间API的一部分,是一个函数式接口。它能够执行复杂的日期操作,例如:获取当月的最后一天、可以获得下一个星期日或者下一年的第一天等。TemporalAdjuster只有一个带Temporal对象参数的抽象方法adjustInto(),可以通过向其传递Temporal对象在其任何实现中调用它。在TemporalAdjusters类中有许多预定义的实现,例如LocalDate、LocalDateTime等。
TemporalAdjusters
TemporalAdjusters是Java 8中处理日期时间的静态工具类,提供了很多静态方法来创建TemporalAdjuster对象,这些方法可以用于对日期时间进行一些常用的调整操作。更准确来说,封装了一些TemporalAdjuster的操作信息。这些方法返回的TemporalAdjuster对象可以用于对日期时间进行相应的调整操作。
API测试
- 自定义日期操作ofDateAdjuster
它接受一个函数作为参数,该函数接受一个日期时间对象并返回一个新的日期时间对象,表示对该日期时间对象进行某种调整后的结果。这个方法返回一个TemporalAdjuster对象,可以用于对日期时间对象进行相应的调整操作。通常情况下,这个方法用于创建自定义的TemporalAdjuster对象,以执行一些复杂的日期时间调整操作。
LocalDate nextYear = LocalDate.now().with(TemporalAdjusters.ofDateAdjuster(new UnaryOperator<LocalDate>() {
@Override
public LocalDate apply(LocalDate localDate) {
return localDate.plusYears(1);
}
}));
System.out.println(nextYear);
//2025-07-31
- 获取当月的最后一天
LocalDate lastDayOfMonth = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
System.out.println(lastDayOfMonth);
//2024-07-31
- 获取当月的第一天
LocalDate firstDayOfMonth = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
System.out.println(lastDayOfMonth);
//2024-07-01
- 获取下个月的第一天
LocalDate localDate = LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth());
System.out.println(localDate);
//2024-08-01
- TemporalAdjusters#next(DayOfWeek dayOfWeek)
将给定的日期调整到下一个指定星期几。这个方法接受一个 DayOfWeek 参数,表示要调整到的星期几。例如,DayOfWeek.MONDAY 表示星期一。使用这个方法,你可以将日期调整到下一个特定星期几。
LocalDate localDate = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
System.out.println(localDate);
//调整到这周五:2024-08-02
- TemporalAdjusters#nextOrSame(DayOfWeek dayOfWeek)
与TemporalAdjusters#next(...)区别在于:TemporalAdjusters.nextOrSame(...) 方法将给定的日期调整到下一个星期几,但是若指定日期与当前日期相同的话,则返回当前日期。
举个例子:
//因为我指定了日期是周三,今天刚好是周三,所以直接返回了当前日期
LocalDate localDate = LocalDate.now().with(TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY));
System.out.println(localDate);
//2024-07-31
//这个则返回了下一个星期三
LocalDate localDate = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY));
System.out.println(localDate);
//2024-08-07
- TemporalAdjusters#previous(DayOfWeek dayOfWeek)
与TemporalAdjusters#next(...)相反,将给定的日期调整到上一个指定星期几。
LocalDate localDate = LocalDate.now().with(TemporalAdjusters.previous(DayOfWeek.WEDNESDAY));
System.out.println(localDate);
//2024-07-24
- TemporalAdjusters#previousOrSame(DayOfWeek dayOfWeek)
与TemporalAdjusters.nextOrSame(...) 相反,将给定的日期调整到上一个星期几,但是若指定日期与当前日期相同的话,则返回当前日期。
LocalDate localDate = LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.WEDNESDAY));
System.out.println(localDate);
//2024-07-31
在TemporalAdjusters中还有很多静态的方法,这里就不再一一举例了。