TemporalAdjusters 是 Java8 中用于日期和时间操作的一个工具类,它通过静态方法提供了大量常用的 TemporalAdjuster 对象,以便执行各种日期校正操作。TemporalAdjuster 是一个函数式接口,其中定义了一个抽象方法 adjustInto(Temporal temporal),用于调整指定的 Temporal 对象。TemporalAdjuster 源码如下:

TemporalAdjusters 类提供的预定义静态方法如下:
firstDayOfMonth():获取当前月的第一天。
firstDayOfNextMonth():获取下月的第一天。
firstDayOfNextYear():获取明年的第一天。
firstDayOfYear():获取当年的第一天。
lastDayOfMonth():获取当月的最后一天,无需再计算当月是 28、29、30 还是 31 天。
lastDayOfNextMonth():获取下月的最后一天。
lastDayOfNextYear():获取明年的最后一天。
lastDayOfYear():获取当年的最后一天。
firstInMonth(DayOfWeek dayOfWeek):获取当月的第一个指定星期几。
lastInMonth(DayOfWeek dayOfWeek):获取当月的最后一个指定星期几。
dayOfWeekInMonth(int week, DayOfWeek dayOfWeek):获取当月第week周的指定星期几。
next(DayOfWeek dayOfWeek):获取当前日期之后(不包括当天)的第一个指定星期几的日期。如果当天就是该星期几,则返回下一周的该日。
nextOrSame(DayOfWeek dayOfWeek):获取当前日期之后(包括当天)的第一个指定星期几的日期。如果当天就是该星期几,则返回当天日期。
previous(DayOfWeek dayOfWeek):获取当前日期之前(不包括当天)的第一个指定星期几的日期。如果今天是该星期几,则返回上一周的该日。
previousOrSame(DayOfWeek dayOfWeek):获取当前日期之前(包括当天)的第一个指定星期几的日期。如果今天是该星期几,则返回当天日期。
该示例将介绍如何简单使用日期校正器 TemporalAdjusters,如查找本月最后一天、或者本月第一天。例如:
package com.hxstrive.jdk8.date_time.temporalAdjusters;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
/**
* TemporalAdjusters 类
* @author hxstrive.com
*/
public class TemporalAdjustersDemo1 {
public static void main(String[] args) {
// 查找当前日期后第一个星期二
LocalDate firstTuesday = LocalDate.now()
.with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));
System.out.println(firstTuesday); //2024-07-02
// 查找本月最后一天
LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
System.out.println(lastDay); //2024-06-30
// 查找本月第一天
LocalDate firstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
System.out.println(firstDay); //2024-06-01
}
}你可以通过实现 TemporalAdjuster 接口来实现自己的校正器。例如:
package com.hxstrive.jdk8.date_time.temporalAdjusters;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjuster;
/**
* TemporalAdjusters 类
* @author hxstrive.com
*/
public class TemporalAdjustersDemo2 {
public static void main(String[] args) {
// 通过实现 TemporalAdjuster 接口来实现自己的校正器
// 下面是计算下一个工作日的校正器
TemporalAdjuster NEXT_WORKDAY = w -> {
LocalDate result = (LocalDate) w;
do {
result = result.plusDays(1);
} while (result.getDayOfWeek().getValue() >= 6);
return result;
};
LocalDate backToWork = LocalDate.now().with(NEXT_WORKDAY);
System.out.println(backToWork); //2024-07-01
}
}注意,lambda 表达式的参数类型为 Temporal,它必须被强制转换为 LocalDate 对象。你可以通过 ofDateAdjuster 方法以及一个 Unaryoperator<LocalDate> 的 lambda 表达式,来避免该强制转换。例如:
package com.hxstrive.jdk8.date_time.temporalAdjusters;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;
/**
* TemporalAdjusters 类
* @author hxstrive.com
*/
public class TemporalAdjustersDemo3 {
public static void main(String[] args) {
// 通过实现 TemporalAdjuster 接口来实现自己的校正器
// 下面是计算下一个工作日的校正器
TemporalAdjuster NEXT_WORKDAY = TemporalAdjusters.ofDateAdjuster(w ->{
LocalDate result = w; // 不需要进行转换
do {
result = result.plusDays(1);
} while(result.getDayOfWeek().getValue() >= 6);
return result;
});
LocalDate backToWork = LocalDate.now().with(NEXT_WORKDAY);
System.out.println(backToWork); //2024-07-01
}
}