PHP高效计算员工工作时长中符合额外薪资时段的秒数
PHP高效计算员工工作时长中符合额外薪资时段的秒数
嘿,我完全懂你现在的烦恼——用循环逐秒检查确实太笨重了,不仅代码冗余,还特别影响效率。其实我们根本不用这么折腾,通过时间区间重叠的数学计算就能轻松搞定,逻辑清晰又高效!
核心思路
问题的本质就是找出「员工打卡时间段」和「额外薪资时间段」的重叠区间,只要算出这个重叠区间的时长(秒数)就可以了,步骤非常简单:
- 把所有时间字符串转换成Unix时间戳(以秒为单位的整数),方便直接做数值计算;
- 重叠区间的起始时间是「员工打卡开始时间」和「额外薪资开始时间」中更晚的那个;
- 重叠区间的结束时间是「员工打卡结束时间」和「额外薪资结束时间」中更早的那个;
- 如果起始时间 ≤ 结束时间,说明两个区间有重叠,用结束时间减起始时间就是符合条件的秒数;如果没有重叠,结果就是0。
具体代码实现
// 你的原始时间数据 $extramoneyforwork_start = "2023-03-10 00:00:00"; $extramoneyforwork_end = "2023-03-10 05:00:00"; $employeeclockedin = "2023-03-10 03:00:00"; $employeeclockedout = "2023-03-10 09:00:00"; // 转换为Unix时间戳(秒级) $extra_start = strtotime($extramoneyforwork_start); $extra_end = strtotime($extramoneyforwork_end); $clock_in = strtotime($employeeclockedin); $clock_out = strtotime($employeeclockedout); // 计算重叠区间的边界 $overlap_start = max($extra_start, $clock_in); $overlap_end = min($extra_end, $clock_out); // 计算符合额外薪资的秒数(如果无重叠则返回0) $secondsofworkwithinextrapaymenttime = max(0, $overlap_end - $overlap_start); // 总工作秒数 $secondsofworkintotal = $clock_out - $clock_in; // 输出结果示例 echo "总工作秒数:{$secondsofworkintotal}<br>"; echo "符合额外薪资的秒数:{$secondsofworkwithinextrapaymenttime}";
测试不同场景
这个方法能覆盖所有可能的时间情况:
- 员工完全在额外时段内工作(比如02:00-04:00):重叠时长就是完整的工作时长;
- 员工完全不在额外时段工作(比如06:00-08:00):结果为0;
- 员工跨额外时段工作(比如04:00-06:00):只会计算04:00-05:00这1小时的秒数。
为什么这个方法更好?
相比你之前的循环逐秒检查,这个方法的时间复杂度是O(1)——不管时间段跨度多大,都是瞬间计算完成,完全不会有性能问题,代码也简洁易维护。
备注:内容来源于stack exchange,提问作者chocwithstarfish
相关产品推荐
相关产品推荐

