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

Node.js如何计算指定考勤时段内超出常规工作时间的总加班时长

跨天打卡加班时长计算解决方案

核心逻辑为逐天统计打卡区间覆盖的所有自然日的加班时长,再累加得到总时长,同时兼容原单天上下班的计算场景。
预设规则:每日常规工作时段为10:00-19:00,该时段不计入加班,其余时段只要落在打卡区间内均计为加班时长。

实现代码

替换原有forEach内的逻辑即可:

getWorkHours.forEach((workhourOT) => {
  try {
    const startWork = moment(workhourOT.starttime, "DD-MM-YYYY hh:mm:ss");
    const endWork = moment(workhourOT.endtime, "DD-MM-YYYY hh:mm:ss");
    let totalOT = 0;

    // 遍历打卡区间覆盖的每一天
    let currentDay = moment(startWork).startOf('day');
    const endDay = moment(endWork).startOf('day');

    while (currentDay.isSameOrBefore(endDay, 'day')) {
      // 计算当天落在打卡区间内的有效起止时间
      const dayStart = moment.max(startWork, moment(currentDay).startOf('day'));
      const dayEnd = moment.min(endWork, moment(currentDay).endOf('day'));
      
      // 当天的常规上下班时间节点
      const officeStart = moment(currentDay).hour(10).minute(0).second(0);
      const officeEnd = moment(currentDay).hour(19).minute(0).second(0);

      // 计算当天早到加班:打卡开始到上班前的时长
      if (dayStart.isBefore(officeStart)) {
        const otBefore = moment.min(officeStart, dayEnd).diff(dayStart, 'hours', true);
        totalOT += otBefore > 0 ? otBefore : 0;
      }

      // 计算当天晚走加班:下班后到打卡结束的时长
      if (dayEnd.isAfter(officeEnd)) {
        const otAfter = dayEnd.diff(moment.max(officeEnd, dayStart), 'hours', true);
        totalOT += otAfter > 0 ? otAfter : 0;
      }

      // 切换到下一天继续计算
      currentDay.add(1, 'day');
    }

    data["TotalWork_OT"] = totalOT.toFixed(1);
  } catch (error) {
    console.log(error);
  }
});

场景验证

  1. 原单天测试场景:上班15-09-21 08:00,下班15-09-21 21:00
    • 早到加班2小时,晚走加班2小时,总时长4.0,和原有逻辑输出完全一致
  2. 跨天测试场景:上班13-09-2021 08:00,下班15-09-2021 20:00
    • 逐天计算累加后总时长为32小时,和示例要求结果匹配

内容的提问来源于stack exchange,提问作者Meet Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:54:05