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

PHP计算两个日期小时差(排除节假日)问题求助

解决方案

要实现排除节假日的小时差计算,核心是遍历日期区间内的每一段时间,跳过节假日对应的时长。以下是修改后的代码:

date_default_timezone_set('Asia/Jakarta');

// 定义需要排除的节假日(格式:YYYY-MM-DD,可根据实际需求扩展)
$holidays = [
    '2023-08-19', // 示例节假日,替换为实际需要排除的日期
    '2023-08-20'
];

$start_date = date_create("2023-08-18 00:00:00");
$end_date = date_create("2023-08-21 00:00:00");

$total_hours = 0;
$total_minutes = 0;

// 复制开始日期用于遍历
$current_date = clone $start_date;

// 逐小时遍历时间区间
while ($current_date < $end_date) {
    $current_day = $current_date->format('Y-m-d');
    // 非节假日的小时才计入总时长
    if (!in_array($current_day, $holidays)) {
        $total_hours++;
    }
    // 当前时间推进1小时
    $current_date->modify('+1 hour');
}

// 处理开始/结束时间的分钟差
$start_min = (int)$start_date->format('i');
$end_min = (int)$end_date->format('i');
$minute_diff = $end_min - $start_min;

if ($minute_diff > 0) {
    $total_minutes = $minute_diff;
} elseif ($minute_diff < 0) {
    $total_hours--;
    $total_minutes = 60 + $minute_diff;
}

// 格式化输出结果
$formatted_minutes = $total_minutes < 10 ? "0{$total_minutes}" : $total_minutes;
$result = "{$total_hours}:{$formatted_minutes}";

echo $result;

关键说明

  • 节假日维护:$holidays数组可根据实际节假日日历动态更新,支持添加任意需要排除的日期。
  • 逐小时校验:通过循环逐小时检查当前时间是否属于节假日,确保只统计有效工作时长。
  • 分钟处理:单独计算开始与结束时间的分钟差,避免因非整点时间导致的误差。
  • 格式兼容:保持原代码的输出格式,分钟数不足10时自动补前导零。

示例验证

若2023-08-19和2023-08-20为节假日,原3天(72小时)区间排除2天后,有效时长为24小时,输出结果为24:00。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:17:23