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

PHP计算两日期间周日总分钟数的代码问题及修复请求

修复后的周日分钟数计算函数

我看了你的代码,发现几个关键问题导致了异常(或返回错误结果)的情况:

  1. 错误使用date()处理时长:date('H:i', $seconds)是把秒数当作Unix时间戳解析,而非总时长。比如86400秒(一整天)对应的是1970年1月2日的00:00,会得到00:00,最终返回0,完全不符合你的需求。
  2. 返回值类型不符:你需要的是分钟数,但原函数返回的是带小数的小时数,比如24小时会返回24,而你实际需要1440分钟。
  3. 未处理无效时长场景:当调整后的结束时间小于等于开始时间时,会给总秒数加上负数或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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:44:55