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

PHP实现跨多天预约的每日有效工作时长(分钟)统计

计算时间区间内每日有效工作分钟数的PHP实现

需求说明

给定起始时间 $startDateTime = "2024-01-06 14:00:00" 和结束时间 $endDateTime = "2024-01-13 14:00:00",按照以下工作时间规则,生成以日期为键、当日有效工作分钟数为值的数组:

  • 周一至周五:9:00-18:00(共540分钟)
  • 周六:9:00-14:00(共300分钟)
  • 周日:无有效工作时间

完整实现代码

<?php
$startDateTime = "2024-01-06 14:00:00";
$endDateTime = "2024-01-13 14:00:00";

// 定义各星期对应的工作时间规则
$workTimeRules = [
    0 => ['start' => '00:00', 'end' => '00:00'], // 周日无工作时间
    1 => ['start' => '09:00', 'end' => '18:00'],
    2 => ['start' => '09:00', 'end' => '18:00'],
    3 => ['start' => '09:00', 'end' => '18:00'],
    4 => ['start' => '09:00', 'end' => '18:00'],
    5 => ['start' => '09:00', 'end' => '18:00'],
    6 => ['start' => '09:00', 'end' => '14:00'], // 周六
];

$start = new DateTime($startDateTime);
$end = new DateTime($endDateTime);
$currentDate = clone $start;

$workMinutesPerDay = [];

// 遍历区间内的每一天
while ($currentDate <= $end) {
    $dateStr = $currentDate->format('Y-m-d');
    $weekday = (int)$currentDate->format('w'); // 获取星期几(0=周日,1=周一...6=周六)
    $dayRule = $workTimeRules[$weekday];

    // 构造当天工作时间的DateTime对象
    $dayWorkStart = new DateTime($dateStr . ' ' . $dayRule['start']);
    $dayWorkEnd = new DateTime($dateStr . ' ' . $dayRule['end']);

    // 确定当天实际有效时间范围
    $actualStart = max($start, $dayWorkStart);
    $actualEnd = min($end, $dayWorkEnd);

    // 计算有效分钟数
    if ($actualEnd <= $actualStart) {
        $workMinutesPerDay[$dateStr] = 0;
    } else {
        $interval = $actualStart->diff($actualEnd);
        $workMinutesPerDay[$dateStr] = $interval->h * 60 + $interval->i;
    }

    // 跳转至下一天
    $currentDate->modify('+1 day');
}

// 输出结果
echo "<pre>";
print_r($workMinutesPerDay);
echo "</pre>";
?>

关键逻辑说明

  1. 规则映射:用数组关联星期几与对应工作时间段,周日直接设置为无工作时间,避免无效计算。
  2. 日期遍历:从起始日期开始逐个遍历到结束日期,确保覆盖区间内所有日期。
  3. 有效时间校准:
    • 取全局起始时间与当天工作开始时间的最大值,排除工作时间外的起始部分。
    • 取全局结束时间与当天工作结束时间的最小值,排除工作时间外的结束部分。
  4. 分钟数计算:若校准后的结束时间早于或等于起始时间,当天有效分钟数为0;否则通过时间差计算实际有效分钟数。

运行代码后将输出与需求示例完全一致的结果:

Array
(
    [2024-01-06] => 0
    [2024-01-07] => 0
    [2024-01-08] => 540
    [2024-01-09] => 540
    [2024-01-10] => 540
    [2024-01-11] => 540
    [2024-01-12] => 540
    [2024-01-13] => 300
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:10:35