Java计算每月同周几日期时缺失31日问题排查
问题分析与解决
你的代码缺失2023-01-31的原因是循环终止条件错误:
你用了date.isBefore(endLocalDate)作为循环判断条件,而endLocalDate是当月最后一天(2023-01-31)。当date走到31号时,date.isBefore(endLocalDate)返回false,循环直接终止,导致31号没被检查是否符合周几的条件。
修改方案1:修正循环条件
把循环的终止条件改成!date.isAfter(endLocalDate)(或者date.compareTo(endLocalDate) <= 0),这样就能包含当月最后一天:
import java.time.LocalDate; import java.util.List; import java.util.ArrayList; class HelloWorld { public static void main(String[] args) { LocalDate startLocalDate = LocalDate.parse("2023-01-03"); LocalDate endLocalDate = startLocalDate.withDayOfMonth(startLocalDate.getMonth().length(startLocalDate.isLeapYear())); int startDayOfWeek = startLocalDate.getDayOfWeek().getValue(); List<LocalDate> listOfDays = new ArrayList<>(); // 修正循环条件,包含endLocalDate for (LocalDate date = startLocalDate; !date.isAfter(endLocalDate); date = date.plusDays(1)) { if (date.getDayOfWeek().getValue() == startDayOfWeek) { listOfDays.add(date); } } System.out.println(listOfDays); } }
修改方案2:更高效的实现(无需每日遍历)
没必要每天逐个检查,直接从起始日期开始每次加7天,直到超过当月最后一天,这样代码更简洁高效:
import java.time.LocalDate; import java.util.List; import java.util.ArrayList; class HelloWorld { public static void main(String[] args) { LocalDate startLocalDate = LocalDate.parse("2023-01-03"); LocalDate endLocalDate = startLocalDate.withDayOfMonth(startLocalDate.getMonth().length(startLocalDate.isLeapYear())); List<LocalDate> listOfDays = new ArrayList<>(); LocalDate currentDate = startLocalDate; while (!currentDate.isAfter(endLocalDate)) { listOfDays.add(currentDate); currentDate = currentDate.plusWeeks(1); // 直接加一周 } System.out.println(listOfDays); } }
运行上述任一修改后的代码,都会输出你期望的结果:
[2023-01-03, 2023-01-10, 2023-01-17, 2023-01-24, 2023-01-31]
内容的提问来源于stack exchange,提问作者Alvin
相关产品推荐
相关产品推荐

