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); } });
场景验证
- 原单天测试场景:上班
15-09-21 08:00,下班15-09-21 21:00- 早到加班2小时,晚走加班2小时,总时长
4.0,和原有逻辑输出完全一致
- 早到加班2小时,晚走加班2小时,总时长
- 跨天测试场景:上班
13-09-2021 08:00,下班15-09-2021 20:00- 逐天计算累加后总时长为32小时,和示例要求结果匹配
内容的提问来源于stack exchange,提问作者Meet Patel
相关产品推荐
相关产品推荐

