PHP计算两日期间周日总分钟数的代码问题及修复请求
修复后的周日分钟数计算函数
我看了你的代码,发现几个关键问题导致了异常(或返回错误结果)的情况:
- 错误使用
date()处理时长:date('H:i', $seconds)是把秒数当作Unix时间戳解析,而非总时长。比如86400秒(一整天)对应的是1970年1月2日的00:00,会得到00:00,最终返回0,完全不符合你的需求。 - 返回值类型不符:你需要的是分钟数,但原函数返回的是带小数的小时数,比如24小时会返回24,而你实际需要1440分钟。
- 未处理无效时长场景:当调整后的结束时间小于等于开始时间时,会给总秒数加上负数或0,虽然不影响最终结果,但跳过这种情况会更严谨。
下面是修复后的函数,完全满足你的需求:
function getWeekEndMinutes($startDate, $endDate) { // 定义周日的有效时长:0秒到86400秒(完整一天),其他日期设为null跳过 $working_hours = [ [0, 86400], // Sun (date('w')返回0代表周日) null, // Mon null, // Tue null, // Wed null, // Thu null, // Fri null // Sat ]; $start = new \DateTime($startDate); $end = new \DateTime($endDate); $totalSeconds = 0; // 转换为当天0点的时间戳,用于遍历每一天 $startMidnight = (clone $start)->setTime(0, 0, 0)->getTimestamp(); $endMidnight = (clone $end)->setTime(0, 0, 0)->getTimestamp(); // 计算开始/结束时间在当天的秒数偏移 $startTimeOffset = $start->getTimestamp() - $startMidnight; $endTimeOffset = $end->getTimestamp() - $endMidnight; // 遍历日期范围内的每一天 for ($currentDayMidnight = $startMidnight; $currentDayMidnight <= $endMidnight; $currentDayMidnight += 86400) { $weekday = date('w', $currentDayMidnight); // 非周日直接跳过 if (!isset($working_hours[$weekday]) || $working_hours[$weekday] === null) { continue; } list($dayStart, $dayEnd) = $working_hours[$weekday]; // 调整开始日期的有效时长 if ($currentDayMidnight === $startMidnight) { $dayStart = max($dayStart, $startTimeOffset); } // 调整结束日期的有效时长 if ($currentDayMidnight === $endMidnight) { $dayEnd = min($dayEnd, $endTimeOffset); } // 只有结束时间大于开始时间时才累加时长 if ($dayEnd > $dayStart) { $totalSeconds += $dayEnd - $dayStart; } } // 将总秒数转换为分钟数返回 return $totalSeconds / 60; }
测试你的示例
当传入2019-11-22 22:00:00到2019-11-28 10:00:00时:
- 范围内的周日是
2019-11-24,完整一天的秒数为86400,转换为分钟数就是86400 / 60 = 1440。 - 调用
getWeekEndMinutes('2019-11-22 22:00:00', '2019-11-28 10:00:00')会返回1440,完全符合预期。
额外说明
- 函数名改为
getWeekEndMinutes更贴合功能,明确返回的是分钟数。 - 使用
list()解构数组让代码更易读。 - 新增无效时长判断,避免不必要的计算逻辑。
内容的提问来源于stack exchange,提问作者user9623807
相关产品推荐
相关产品推荐

