
本文介绍使用 Java 9+ 的 LocalDate.datesUntil() 方法,高效生成指定起止日期间所有周一(广播周起始日)的 LocalDate 列表,无需循环或手动计算,代码简洁且线程安全。
本文介绍使用 java 9+ 的 `localdate.datesuntil()` 方法,高效生成指定起止日期间所有周一(广播周起始日)的 `localdate` 列表,无需循环或手动计算,代码简洁且线程安全。
在广播日历(Broadcast Calendar)中,每周统一以周一为起始日,因此获取某日期范围内的所有“周开始日”,即等价于提取该范围内所有周一对应的日期。Java 9 引入的 LocalDate.datesUntil(end, period) 方法为此类场景提供了原生、函数式、高性能的解决方案:它返回一个从起始日期(含)出发、按指定周期(如每周)递增的 Stream<localdate></localdate>,可直接收集为列表。
以下为完整实现示例(基于您提供的日期范围:2024年10月7日至2024年12月29日):
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));
// datesUntil 包含起始日,不包含结束日;因此 end 需 +1 天以确保覆盖到 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-12-23(共12个日期)
}
}</localdate></localdate>
✅ 关键说明与最佳实践:
-
datesUntil(end, Period.ofWeeks(1))默认包含起始日,不包含结束日。为确保逻辑严谨(例如当end恰好是周一时也应被包含),推荐对end调用plusDays(1)后传入; - 若原始
start不一定是周一(如2024-10-08是周二),应先用TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)对齐至首个有效周一,避免遗漏; - 该方法基于不可变
LocalDate,天然线程安全,适用于高并发批量处理; - 不依赖外部库,纯 JDK 解决方案,兼容 Java 9 及以上版本;
- 避免使用已弃用的
Date和SimpleDateFormat,全程采用java.timeAPI,语义清晰、时区无关(广播日历通常不涉及时区偏移)。
综上,利用 LocalDate.datesUntil() 是获取广播日历周一日期列表最简洁、健壮且符合现代 Java 实践的方式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











