PHP函数开发需求:计算30天后的有效工作日(规避周末与节假日)
解决方案:先推30天再调整为工作日
我完全get到你的需求了——你要的不是统计30个工作日,而是先把起始日期往后推30个自然日,再把这个最终日期调整为最近的下一个工作日(避开周末和你预设的节假日)。之前你搜到的都是“数工作日天数”的方案,确实和你的需求不匹配,我来帮你调整代码逻辑。
核心思路拆解
- 第一步:先计算起始日期 + 30天的初始结束日期
- 第二步:检查这个初始日期是否为工作日(非周末 + 不在预设节假日列表)
- 第三步:如果不符合,就一天一天往后顺延,直到找到第一个符合条件的工作日
修改后的完整代码
// 预设的节假日列表(格式: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
相关产品推荐
相关产品推荐

