temporaladjuster 是 java 8 日期时间 api 中封装日期调整逻辑的函数式接口,用于实现如“下周一”“当月最后一天”等语义化计算;可通过内置 temporaladjusters 快速使用,也可自定义处理工作日与节假日。

什么是 TemporalAdjuster 及其作用
TemporalAdjuster 是 Java 8 新日期时间 API(java.time)中用于“调整”日期时间的函数式接口。它不直接表示某个具体日期,而是封装一种日期计算逻辑,比如“本月第一个周一”、“下个工作日”、“当月最后一天”等。你可以把它理解为一个可复用的、面向业务语义的日期计算器。
用内置调整器快速实现常见工作日逻辑
Java 已提供 TemporalAdjusters 工具类,包含大量预定义的调整器,适合基础工作日场景:
-
TemporalAdjusters.next(DayOfWeek.MONDAY)→ 获取下一个周一(跳过当天) -
TemporalAdjusters.previousOrSame(DayOfWeek.FRIDAY)→ 获取当前或之前最近的周五 -
TemporalAdjusters.firstInMonth(DayOfWeek.WEDNESDAY)→ 当月第一个周三 -
TemporalAdjusters.lastInMonth(DayOfWeek.SATURDAY)→ 当月最后一个周六
这些方法返回 TemporalAdjuster 实例,可直接传给 with() 方法使用,例如:LocalDate nextMon = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
自定义 TemporalAdjuster 计算“下一个工作日”(跳过周末+节假日)
若需跳过周末和自定义节假日(如公司放假列表),需实现自己的 TemporalAdjuster。推荐使用 lambda 表达式或静态工厂方法,避免冗长的匿名类:
- 定义节假日集合(建议用
Set<localdate></localdate>,并确保不可变) - 编写调整逻辑:从起始日开始逐日递增,跳过
SATURDAY/SUNDAY和节假日,直到找到首个符合条件的日期 - 返回一个符合
TemporalAdjuster接口的 lambda
示例代码:
public static TemporalAdjuster nextWorkingDay(Set<localdate> holidays) {
return temporal -> {
LocalDate date = LocalDate.from(temporal);
do {
date = date.plusDays(1);
} while (date.getDayOfWeek() == DayOfWeek.SATURDAY
|| date.getDayOfWeek() == DayOfWeek.SUNDAY
|| holidays.contains(date));
return date;
};
}
// 使用:
Set<localdate> myHolidays = Set.of(LocalDate.of(2024, 10, 1), LocalDate.of(2024, 10, 2));
LocalDate nextWork = today.with(nextWorkingDay(myHolidays));
</localdate></localdate>
进阶技巧:链式调整与组合逻辑
TemporalAdjuster 支持组合使用,例如先找“本月第一个工作日”,再确保它不是节假日:
- 用
TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)找到第一个周一 - 再用自定义调整器向后推至首个非节假日工作日
- 也可用
with()连续调用多次,如:date.with(firstMon).with(nextWorkingDay(holidays))
注意:调整顺序影响结果。若需“当月最后一个工作日”,应先取 lastDayOfMonth(),再反向查找最近的工作日(可用自定义调整器配合 minusDays 循环实现)。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











