使用temporaladjusters.next(dayofweek.monday)可直接获取下周一日期,若当天为周一则返回七天后的周一;需本周一(含当天)时改用previousorsame,代码简洁可靠且线程安全。

要计算下周一的日期,Java 8 引入的 TemporalAdjusters 提供了简洁可靠的方式,无需手动判断星期几或加减天数。
使用 TemporalAdjusters.next(DayOfWeek.MONDAY)
这是最直接的方法。它会从当前日期(或指定日期)出发,找到下一个周一(不包括当天,即使当天就是周一,也会返回下周的周一)。
-
注意行为细节:如果今天是周一,
next(MONDAY)返回的是七天后的周一,不是当天。 -
若需“本周一(含当天)”,应改用
TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY),再配合逻辑判断是否为今天——但严格意义上的“下周一”通常指下一个周期的周一,所以next更符合语义。
完整代码示例
以下是一个可运行的示例,演示如何获取下周一的 LocalDate:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
<p>public class NextMondayExample {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate nextMonday = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
System.out.println("今天: " + today); // 例如:2024-06-12(周三)
System.out.println("下周一: " + nextMonday); // 输出:2024-06-17
}
}</p>
扩展:支持任意起始日期和时区场景
上述方法基于 LocalDate,适用于纯日期逻辑。如需结合时间或时区:
- 若从
ZonedDateTime出发,先提取toLocalDate()再调整,或用with(TemporalAdjusters.next(...))直接作用于ZonedDateTime(它会保持原有时间与偏移,仅调整日期部分)。 - 若业务要求“按某一时区理解的下周一”,建议先转换到该时区的
ZonedDateTime,再调用 adjuster,避免因本地时区导致日期偏差。
常见误区提醒
避免用固定加法(如 plusDays( (8 - today.getDayOfWeek().getValue()) % 7 ))手动计算,易出错且可读性差:
-
DayOfWeek.getValue()周一为 1,周日为 7,取模逻辑容易混淆边界(如周日时(8-7)%7=1得到周一,但实际应加 1 天还是 8 天?) -
TemporalAdjusters封装了已验证的逻辑,线程安全、语义清晰、适配所有Temporal类型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











