
本文介绍使用 Java 9+ 的 LocalDate.datesUntil() 方法,高效生成指定日期区间内全部周一日期列表,适用于广播日历等以周一为每周起点的业务场景。
本文介绍使用 java 9+ 的 `localdate.datesuntil()` 方法,高效生成指定日期区间内全部周一日期列表,适用于广播日历等以周一为每周起点的业务场景。
在广播日历(Broadcast Calendar)中,每周固定以周一作为周起始日(Week Start Date),因此在处理广告排期、收视率统计或内容发布计划时,常需提取某时间段内所有周一日期。给定起止日期(如 2024-10-07 至 2024-12-29),目标是生成形如 2024-10-07, 2024-10-14, ..., 2024-12-23 的完整周一日期序列。
Java 9 引入的 LocalDate.datesUntil(end, period) 方法为此类需求提供了简洁、不可变且线程安全的解决方案。它返回一个 Stream<localdate></localdate>,支持按固定周期(如每周)生成连续日期流:
import java.time.LocalDate;
import java.time.Period;
import java.util.List;
public class BroadcastMondayExtractor {
public static List<LocalDate> getAllMondaysBetween(LocalDate start, LocalDate end) {
// 确保起始日期为周一:若非周一,则向前调整至最近的周一
LocalDate firstMonday = start.with(java.time.temporal.TemporalAdjusters.previousOrSame(java.time.DayOfWeek.MONDAY));
// 生成从 firstMonday 开始、间隔一周、不超过 end 的所有日期
return firstMonday.datesUntil(end.plusDays(1), Period.ofWeeks(1))
.toList();
}
public static void main(String[] args) {
LocalDate start = LocalDate.of(2024, 10, 7);
LocalDate end = LocalDate.of(2024, 12, 29);
List<LocalDate> mondays = getAllMondaysBetween(start, end);
mondays.forEach(System.out::println);
// 输出:
// 2024-10-07
// 2024-10-14
// 2024-10-21
// ...
// 2024-12-23
}
}✅ 关键说明与最佳实践:
-
datesUntil(end, period)的end参数是排他性(exclusive),因此传入end.plusDays(1)可确保包含边界上的周一(如2024-12-23); - 若原始
start不是周一,直接使用datesUntil可能遗漏首个周一——推荐先用TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)标准化起始点; - 该方法天然支持不可变语义与函数式链式调用,无需手动循环或
while逻辑,代码更健壮、可读性更高; - 若需兼容 Java 8,可改用
while循环 +plusWeeks(1)迭代,但需注意边界判断和List手动构建。
综上,利用 LocalDate.datesUntil() 是获取广播日历周一序列的现代、推荐方式,兼顾简洁性、性能与可维护性。

















