You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算跨天工作中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:24:53