temporaladjusters.dayofweekinmonth用于将日期调整为某月第n个指定星期几,参数ordinal支持正数(第几个)和负数(倒数第几个),需自行反推具体序号;若目标不存在则抛出datetimeexception。

TemporalAdjusters.dayOfWeekInMonth 用于定位某月中“第 N 个星期几”,比如“本月第三个星期五”或“本月最后一个星期一”。它不直接返回“第几个”,而是帮你把一个日期调整到指定的第几个星期几——你需要自己根据目标日期反推它是第几个。
理解 dayOfWeekInMonth 的参数含义
它的签名是:
TemporalAdjusters.dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)
其中:
- ordinal:整数,表示第几个(1 = 第一个,2 = 第二个,…,-1 = 最后一个,-2 = 倒数第二个)
- dayOfWeek:星期几(如 DayOfWeek.MONDAY)
例如:dayOfWeekInMonth(3, DayOfWeek.FRIDAY) 表示“当月第三个星期五”;dayOfWeekInMonth(-1, DayOfWeek.SUNDAY) 表示“当月最后一个星期日”。
如何从一个日期反推出它是当月第几个星期几?
如果你有一个具体日期(比如 2024-06-14),想知道它是 6 月的第几个星期五,可以这样算:
- 先获取该日期在当月的天数(
date.getDayOfMonth()) - 再获取该月第一天是星期几(
date.withDayOfMonth(1).getDayOfWeek()) - 计算:第几个 =
(dayOfMonth - 1) / 7 + 1(整除,向下取整)
例如:2024-06-14 是星期五,6 月 1 日是星期六 → 6 月第一个星期五是 6 月 7 日(第 7 天),14 是第 2 个((14−1)÷7+1 = 13÷7+1 = 1+1 = 2)。
常用写法示例
获取本月第三个星期三:
LocalDate.now().with(TemporalAdjusters.dayOfWeekInMonth(3, DayOfWeek.WEDNESDAY))
获取本月最后一个星期一:
LocalDate.now().with(TemporalAdjusters.dayOfWeekInMonth(-1, DayOfWeek.MONDAY))
注意:如果该月没有第 N 个对应星期几(比如 2 月可能没有第 5 个星期四),它会抛出 DateTimeException。建议用 try-catch 或先用 YearMonth.lengthOfMonth() 预判。
实用小技巧:快速判断第几个
一行代码算出某日是当月第几个星期几:
int nth = (date.getDayOfMonth() + 6 - date.getDayOfWeek().getValue()) / 7 + 1;
原理:把当月第一天对齐到周一(值为 1),再统一按周偏移计算。结果就是第几个,无需查日历。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











