时间中的equals和isBefore的区别

文章讨论了一个关于使用JavaLocalDate对象的while循环问题,指出原始条件`begin.equals(end)`会导致循环无法执行。建议修改为`begin.isBefore(end.plusDays(1))`以正确遍历指定日期范围。
摘要由CSDN通过智能技术生成
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 对象  
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
public String addAttendance(HttpSession session) { Integer userId = (Integer) session.getAttribute("userid"); // Integer userId =1; LocalDateTime now = LocalDateTime.now(); Attendance lastAttendance = attendanceService.getByAscTime(userId); Attendance attendance = new Attendance(); attendance.setUserid(userId); attendance.setDate(Date.from(now.atZone(ZoneId.systemDefault()).toInstant())); // 获取当前本机时间 LocalDate localDate = now.toLocalDate(); LocalTime localTime = now.toLocalTime(); // 判断数据库没有打卡记录或者有下班签到 if (lastAttendance == null || lastAttendance.getType().equals("下班签到")) { if (localTime.isBefore(LocalTime.of(9, 0))) { attendance.setType("上班签到"); } else if (localDate.equals(getLastAttendanceDate(lastAttendance))) { attendance.setType("下班签到"); } else if (localTime.isAfter(LocalTime.of(9, 0))){ attendance.setType("迟到"); }else if (localTime.isBefore(LocalTime.of(9, 17))){ attendance.setType("早退"); } } else { if (localDate.equals(getLastAttendanceDate(lastAttendance))) { if (localTime.isBefore(LocalTime.of(9, 0))) { attendance.setType("上班签到"); } else if (localTime.isBefore(LocalTime.of(17, 0))){ attendance.setType("早退"); }else if (localTime.isBefore(LocalTime.of(17, 0))){ attendance.setType("下班签到"); } } else { if (localTime.isBefore(LocalTime.of(9, 0))) { attendance.setType("上班签到"); } else if (localTime.isAfter(LocalTime.of(9, 0))){ attendance.setType("迟到"); }else if (localTime.isBefore(LocalTime.of(17, 0))){ attendance.setType("早退"); } } } attendanceService.save(attendance); return "success"; } private LocalDate getLastAttendanceDate(Attendance lastAttendance) { if (lastAttendance == null) { return null; } Date date = lastAttendance.getDate(); Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); return instant.atZone(zoneId).toLocalDate(); } }
06-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W a C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值