java中统计指定日期范围内周末天数应使用java.time.localdate遍历并判断dayofweek,逐日检查是否为saturday或sunday;大范围时可优化为计算整周数加余数单独处理,注意覆盖起止日且不考虑调休。

在 Java 中统计指定日期范围内(含起止日)的周末天数,核心思路是:遍历区间内每一天,判断是否为星期六或星期日。推荐使用 java.time API(Java 8+),它清晰、线程安全且不易出错。
用 LocalDate 遍历并判断星期几
这是最直观可靠的方式。利用 LocalDate 的 getDayOfWeek() 方法获取星期枚举,再比对 DayOfWeek.SATURDAY 和 DayOfWeek.SUNDAY:
- 从起始日期开始,逐天递增,直到超过结束日期
- 对每个日期调用
date.getDayOfWeek(),检查是否等于 SATURDAY 或 SUNDAY - 累计匹配次数即可
示例代码:
import java.time.DayOfWeek;
import java.time.LocalDate;
<p>public static long countWeekends(LocalDate start, LocalDate end) {
if (start.isAfter(end)) return 0;
long count = 0;
LocalDate date = start;
while (!date.isAfter(end)) {
DayOfWeek dow = date.getDayOfWeek();
if (dow == DayOfWeek.SATURDAY || dow == DayOfWeek.SUNDAY) {
count++;
}
date = date.plusDays(1);
}
return count;
}</p>优化:避免逐天遍历(适合大范围)
若日期跨度很大(如几年),逐天遍历虽正确但略低效。可先计算完整周数,再处理首尾不足一周的剩余天数:
- 算出总天数:
ChronoUnit.DAYS.between(start, end) + 1 - 整周数:
fullWeeks = totalDays / 7→ 贡献fullWeeks * 2个周末日 - 剩余天数:
remainder = totalDays % 7,从 start 开始向后取 remainder 天,单独判断其中的周六、日
注意:需确保起始日参与计算,且剩余段要覆盖 [start + fullWeeks×7, end] 区间。
注意时区与节假日的区别
上述方法统计的是**法定周末(周六日)**,不考虑调休或实际放假安排:
-
LocalDate无时区概念,结果确定,适合业务逻辑中的常规周末统计 - 如需支持“调休上班日不算周末”或“法定节假日补班”,需额外维护节假日表,并结合规则过滤
- 不要用
Calendar(已过时),避免SimpleDateFormat等非线程安全类
简单测试建议
验证时可选几个典型区间:
- 单日:如
2024-06-01(周六)→ 返回 1;2024-06-02(周日)→ 返回 1;2024-06-03(周一)→ 返回 0 - 跨周末:如
2024-06-01到2024-06-02→ 返回 2 - 整月:如
2024-06-01到2024-06-30→ 共 30 天,含 4 个完整周末(8 天)+ 6 月 1 日(六)、2 日(日)已计入,实际共 9 个周末日(可手算核对)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











