Java中TemporalAdjusters可简洁调整日期,如next(DayOfWeek.FRIDAY)获取当前日后首个周五,lastDayOfMonth()获取月末,支持组合使用如lastInMonth(DayOfWeek.FRIDAY),且线程安全、自动处理闰年等细节。

Java 中使用 TemporalAdjusters 可以非常简洁地将日期调整到特定时间点,比如“下周五”或“月末”。关键在于理解它提供的预定义调节器(adjuster),以及如何组合使用。
调整到下周五
注意:“下周五”通常指**当前日期之后的第一个周五**(不包含当天,即使当天就是周五)。TemporalAdjusters.next(DayOfWeek.FRIDAY) 正是为此设计的:
LocalDate today = LocalDate.now(); LocalDate nextFriday = today.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)); // 例如:今天是周三(2024-06-12),结果是 2024-06-14(本周五) // 如果今天是周五(2024-06-14),结果是 2024-06-21(下周五)
如果你希望“下周的周五”严格指**从本周日开始算起的下一个周五**(即跳过本周剩余天数),那就要用 nextOrSame 配合手动偏移,但绝大多数业务场景用 next() 就够了。
调整到月末
直接使用 TemporalAdjusters.lastDayOfMonth() 即可,它返回当月最后一天:
LocalDate anyDate = LocalDate.of(2024, 6, 10); LocalDate endOfMonth = anyDate.with(TemporalAdjusters.lastDayOfMonth()); // 结果:2024-06-30
这个调节器对所有月份都适用,自动处理 2 月闰年、大小月等细节,无需额外判断。
其他实用组合
有时需要更灵活的逻辑,比如“本月最后一个周五”或“下个月第一个周一”,这时可以组合使用:
-
本月最后一个周五:
date.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY)) -
下个月第一天:
date.with(TemporalAdjusters.firstDayOfNextMonth()) -
本周周一(本周开始):
date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)) -
本周周日(本周结束):
date.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY))
注意事项
TemporalAdjusters 是线程安全的,可复用;它作用于实现了 Temporal 接口的类型(如 LocalDate、LocalDateTime),但不能直接用于 Instant 或带时区的类型(需先转换为 LocalDateTime 或 ZonedDateTime 再调整)。
另外,所有 nextXxx 类方法都不包含当天,而 nextOrSameXxx 会包含——选哪个取决于你的业务定义。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











