public TurnoverReportVO getTurnoverStatistics(LocalDate begin, LocalDate end) {
//创建如期集合
List<LocalDate> dateList = new ArrayList<>();
dateList.add(begin);
while (begin.equals(end)) {
//计算日期,把每一天存起来
begin = begin.plusDays(1);
dateList.add(begin);
}
}
这个 while
循环的条件 begin.equals(end)
是有问题的。因为 LocalDate
的 equals
方法会检查两个日期是否完全相同(包括年、月、日),所以这个循环实际上永远不会执行,除非 begin
和 end
是同一个日期。
如果你的目的是在 begin
和 end
之间生成所有的日期(包括 begin
和 end
),那么循环条件应该是 begin.isBefore(end)
或 begin.isBefore(end.plusDays(1))
。
为什么不会执行过呢?
永远不会执行的原因在于 while
循环的条件设置得不正确。在这个例子中,循环的条件是 begin.equals(end)
,这意味着只有当 begin
和 end
指向完全相同的日期时,循环才会执行。由于 begin
和 end
是在方法参数中传入的,它们几乎不可能是相同的日期(除非调用方法时特意传入了相同的日期),因此循环体中的代码永远不会被执行。
此外,即使 begin
和 end
是相同的日期,循环也会立即结束,因为 begin
在循环体内被增加了一天(begin = begin.plusDays(1)
),之后就不再等于 end
了。这意味着循环体中的代码只会执行一次(如果 begin
和 end
初始时相同),然后循环就会结束。
要修复这个问题,应该使用一个不同的循环条件,以确保循环能够遍历从 begin
到 end
之间的所有日期。正确的做法是使用 begin.isBefore(end)
或 begin.isBefore(end.plusDays(1))
作为循环条件,这样循环就会继续执行,直到 begin
变成 end
的下一天为止。这样,循环体内的代码就会为 begin
和 end
之间的每一个日期执行一次。
修改后代码是:
public TurnoverReportVO getTurnoverStatistics(LocalDate begin, LocalDate end) {
// 创建日期列表
List<LocalDate> dateList = new ArrayList<>();
dateList.add(begin);
// 循环直到 end(包括 end)
while (begin.isBefore(end.plusDays(1))) {
// 计算日期,把每一天存起来
begin = begin.plusDays(1);
dateList.add(begin);
}
// ... 其他逻辑,例如使用 dateList 生成 TurnoverReportVO
return null; // 这里只是一个示例,应该返回适当的 TurnoverReportVO 对象
}