PHP实现特殊规则下的下一个工作日计算及跳过指定银行假日
完善PHP函数
get_next_workday()以满足自定义工作日规则 我来帮你实现符合需求的get_next_workday()函数,同时兼顾两个核心规则:跳过周五13:00至周日24:00期间的周一,以及排除指定银行假日。
需求回顾
- 基础规则:工作日为周一至周五
- 特殊规则:若当前时间处于周五13:00到周日24:00之间,需跳过紧接着的周一,直接寻找下一个符合条件的工作日
- 额外规则:需排除数组中声明的银行假日
完整实现代码
function get_next_workday() { // 定义银行假日列表(格式:d-M-Y) $bankhols = array( '25-Dec-2018', '26-Dec-2018', // 可根据需要添加更多假日 ); $current_time = time(); $skip_next_monday = false; // 判断当前是否处于周五13:00至周日24:00之间 $current_day = date('w', $current_time); $current_hour = (int)date('H', $current_time); if ($current_day == 5 && $current_hour >= 13) { // 周五13点之后 $skip_next_monday = true; } elseif ($current_day == 6 || $current_day == 0) { // 周六或周日全天 $skip_next_monday = true; } // 从下一天开始逐个检查,直到找到符合条件的工作日 $days_to_check = 1; while (true) { $candidate_time = strtotime("+$days_to_check day", $current_time); $candidate_day_num = (int)date('w', $candidate_time); $candidate_day_text = date('d-M-Y', $candidate_time); // 检查是否是要跳过的周一 if ($skip_next_monday && $candidate_day_num == 1) { $days_to_check++; continue; } // 检查是否是工作日(周一至周五)且非银行假日 if ($candidate_day_num > 0 && $candidate_day_num < 6 && !in_array($candidate_day_text, $bankhols)) { // 返回格式化后的日期或时间戳,这里返回格式化日期 return date('Y-m-d', $candidate_time); // 若需要返回时间戳,可改为 return $candidate_time; } $days_to_check++; } } // 测试示例 echo get_next_workday();
代码关键点说明
特殊时间段判断:
- 先检查当前时间是否在周五13点后、周六或周日,标记是否需要跳过下一个周一
- 这样处理能精准覆盖需求中“跳过周五13:00至周日24:00期间的周一”的规则
动态循环检查:
- 放弃原代码固定检查5天的逻辑,改用
while(true)循环,确保在遇到连续假日+周末的极端情况时也能找到正确的下一个工作日
- 放弃原代码固定检查5天的逻辑,改用
假日与工作日验证:
- 先判断候选日期是否是需要跳过的周一,再验证是否为周一至周五的工作日,最后检查是否不在银行假日列表中
- 顺序优化能减少不必要的判断,提升效率
灵活的返回格式:
- 示例中返回
Y-m-d格式的日期字符串,你可以根据需求改为返回时间戳或其他日期格式
- 示例中返回
内容的提问来源于stack exchange,提问作者NuclearApe
相关产品推荐
相关产品推荐

