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

PHP函数开发需求:计算30天后的有效工作日(规避周末与节假日)

解决方案:先推30天再调整为工作日

我完全get到你的需求了——你要的不是统计30个工作日,而是先把起始日期往后推30个自然日,再把这个最终日期调整为最近的下一个工作日(避开周末和你预设的节假日)。之前你搜到的都是“数工作日天数”的方案,确实和你的需求不匹配,我来帮你调整代码逻辑。

核心思路拆解

  1. 第一步:先计算起始日期 + 30天的初始结束日期
  2. 第二步:检查这个初始日期是否为工作日(非周末 + 不在预设节假日列表)
  3. 第三步:如果不符合,就一天一天往后顺延,直到找到第一个符合条件的工作日

修改后的完整代码

// 预设的节假日列表(格式:m-d)
$holidays = [
    '01-01', '01-06', '03-30', '04-01', '04-02',
    '05-01', '05-08', '07-05', '08-29', '09-01',
    '09-15', '11-01', '11-17', '12-24', '12-25', '12-26'
];

// 起始日期示例(替换成你的$row['prijem'])
$startDateStr = '2018-05-24';
$startTimestamp = strtotime($startDateStr);

// 第一步:先计算起始日期加30天的初始结束日期
$endTimestamp = strtotime('+30 days', $startTimestamp);

// 第二步:循环检查并调整到下一个工作日
while (true) {
    // 检查是否是周末:date('N')返回1-5是工作日,6=周六,7=周日
    $isWeekend = date('N', $endTimestamp) >= 6;
    // 检查是否是节假日
    $isHoliday = in_array(date('m-d', $endTimestamp), $holidays);
    
    if (!$isWeekend && !$isHoliday) {
        // 符合条件,跳出循环
        break;
    }
    
    // 不符合,顺延一天
    $endTimestamp = strtotime('+1 day', $endTimestamp);
}

// 格式化输出结果
$endDate = date("d.m.Y", $endTimestamp);
echo $endDate; // 示例输出:25.06.2018

代码说明

  • 初始日期计算:直接用strtotime('+30 days', $startTimestamp)一步到位,避免了原来代码中数工作日的逻辑错误
  • 工作日判断:用date('N')来识别周末,比判断date('w')(0=周日,6=周六)更直观,1-5就是工作日
  • 节假日匹配:保持你原来的m-d格式,适配每年固定的节假日
  • 循环顺延:只要当前日期是周末或节假日,就往后推一天,直到找到第一个合法工作日

示例验证

针对你提到的场景:

  • 起始日期:2018-05-24
  • 初始30天后日期:2018-06-23(周六,属于周末)
  • 顺延1天到2018-06-24(周日,还是周末)
  • 再顺延1天到2018-06-25(周一,非周末且不在节假日列表),最终结果正确

如果你需要把这段逻辑封装成可复用的函数,也可以这样写:

function getAdjustedEndDate($startDateStr, $holidays) {
    $startTimestamp = strtotime($startDateStr);
    if (!$startTimestamp) {
        // 处理无效日期的情况
        return false;
    }
    
    $endTimestamp = strtotime('+30 days', $startTimestamp);
    
    while (true) {
        $isWeekend = date('N', $endTimestamp) >= 6;
        $isHoliday = in_array(date('m-d', $endTimestamp), $holidays);
        
        if (!$isWeekend && !$isHoliday) {
            break;
        }
        
        $endTimestamp = strtotime('+1 day', $endTimestamp);
    }
    
    return date("d.m.Y", $endTimestamp);
}

// 使用示例
$holidays = [/* 你的节假日列表 */];
echo getAdjustedEndDate('2018-05-24', $holidays); // 输出25.06.2018

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:17:43