localdate.with(temporaladjusters.next(dayofweek.monday)) 获取严格下一个周一(跳过当天),而获取“本周一或下周一”应使用 previousorsame 后加一周,或三元判断;next 和 nextorsame 语义不同,不可混淆。

直接用 LocalDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY)) 是获取严格意义上的下一个周一,即从当前日期的第二天起找第一个周一。如果今天就是周一,它不会返回今天,而是返回下下周的周一。
想获取“本周一(若今天是周一则为今天)或下周一”
这是更常见的业务需求:希望得到离现在最近的、不早于今天的周一。
- 如果今天是周一 → 返回今天
- 如果今天是周二至周日 → 返回本周内即将到来的周一(即下周周一)
推荐写法:
LocalDate nextOrTodayMonday = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).plusWeeks(1);
说明:先“往回找最近的周一(含今天)”,再加一周,就得到不早于今天的第一个周一。等价于:
LocalDate nextOrTodayMonday = date.getDayOfWeek() == DayOfWeek.MONDAY ? date : date.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
想严格获取“下下周的周一”(即跳过本周所有日期)
那就用你原来的写法,它确实符合这个语义:
LocalDate strictlyNextMonday = date.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
例如:
- 今天是 2024-06-10(周一)→ 返回 2024-06-17(下周一)
- 今天是 2024-06-11(周二)→ 也返回 2024-06-17
- 今天是 2024-06-16(周日)→ 同样返回 2024-06-17
注意 adjuster 的语义差异
TemporalAdjusters.next() 和 nextOrSame() 行为不同,别混淆:
-
next(DayOfWeek.MONDAY):从明天开始找,绝不返回今天 -
nextOrSame(DayOfWeek.MONDAY):从今天开始找,今天是周一就返回今天 -
previousOrSame(DayOfWeek.MONDAY):往回找,含今天
所以,不要误用 nextOrSame 代替 next,它们解决的是不同问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











