如何计算跨天工作中01:00-06:00时段的有效工时?
解决跨天场景下01:00-06:00时段工时统计问题
原代码的核心问题在于仅靠分支判断覆盖场景,逻辑漏洞多,完全没处理跨天工作时段(如周一23:00到周二05:00),且存在LocalDateTime.from(oneAM)这类类型转换错误。以下是修复方案:
核心思路
编写通用方法,通过遍历工作时段覆盖的所有日期,逐一计算每日01:00-06:00区间与工作时段的重叠时长,最后累加得到总时长。这种方式能覆盖所有场景,包括跨天、完全包含区间、部分重叠等。
修改后的代码
首先新增计算重叠时长的工具方法:
private Duration calculateNightHours(LocalDateTime workStart, LocalDateTime workEnd) { Duration totalNightDuration = Duration.ZERO; LocalDate currentDate = workStart.toLocalDate(); // 遍历工作时段覆盖的每一天 while (!currentDate.isAfter(workEnd.toLocalDate())) { // 生成当天的01:00和06:00时间点 LocalDateTime dayOneAM = LocalDateTime.of(currentDate, LocalTime.of(1, 0)); LocalDateTime daySixAM = LocalDateTime.of(currentDate, LocalTime.of(6, 0)); // 计算重叠区间的开始和结束:取两个区间的晚开始、早结束 LocalDateTime overlapStart = workStart.isAfter(dayOneAM) ? workStart : dayOneAM; LocalDateTime overlapEnd = workEnd.isBefore(daySixAM) ? workEnd : daySixAM; // 如果重叠区间有效(开始在结束之前),累加时长 if (overlapStart.isBefore(overlapEnd)) { totalNightDuration = totalNightDuration.plus(Duration.between(overlapStart, overlapEnd)); } currentDate = currentDate.plusDays(1); } return totalNightDuration; }
然后替换tableChanged方法中计算夜间时长的代码段:
// 原代码中计算Nattetimer的部分替换为: Duration nightDuration = calculateNightHours(startDateTime, endDateTime); long nightMinutes = nightDuration.toMinutes(); long nightHours = nightMinutes / 60; long nightRemainingMinutes = nightMinutes % 60; String nightTimeStr = String.format("%02d:%02d", nightHours, nightRemainingMinutes); model.setValueAt(nightTimeStr, row, 8);
场景验证
- 周一23:00到周二05:00:遍历周一、周二两天。周一的01-06区间与工作时段无重叠;周二的01-06区间中,重叠部分是01:00到05:00,时长4小时,符合预期。
- 00:30到07:00:当天01-06区间完全被覆盖,总夜间时长5小时。
- 02:00到04:30:完全在01-06区间内,时长2小时30分钟。
内容的提问来源于stack exchange,提问作者DinoKing
相关产品推荐
相关产品推荐

