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
相关产品推荐
相关产品推荐

