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

如何在PHP中实现跳过节假日与周末的日期偏移计算?

日期顺延至非周末非节假日的PHP完整实现

需求说明

给定d/m/Y格式的起始日期(如22/12/2022),先计算该日期加3天后的初始目标日期;若初始日期是周末(周六/周日)或节假日,则持续向后顺延,直到找到第一个既非周末也非节假日的工作日。例如:

  • 初始计算结果为25/12/2022(周日+节假日),顺延至26/12/2022(节假日),再顺延至27/12/2022(节假日),最终确定为28/12/2022。

完整PHP实现代码

<?php
// 输入起始日期(d/m/Y格式)
$inputDate = '22/12/2022';

// 初始化日期对象,先加上3天
$currentDate = DateTime::createFromFormat('d/m/Y', $inputDate);
$currentDate->modify('+3 days');

/**
 * 获取指定范围内的节假日数组(实际项目替换为数据库查询逻辑)
 * @param DateTime $start 起始日期
 * @param DateTime $end 结束日期
 * @return array 返回Y-m-d格式的节假日日期数组
 */
function fetchHolidays(DateTime $start, DateTime $end): array
{
    // 示例:模拟数据库查询的节假日数据
    // 实际场景中替换为SQL查询,比如:
    // SELECT date FROM holidays WHERE date BETWEEN ? AND ?
    $holidays = [
        '2022-12-25',
        '2022-12-26',
        '2022-12-27'
    ];
    return $holidays;
}

/**
 * 判断日期是否为非工作日(周末或节假日)
 * @param DateTime $date 待判断日期
 * @param array $holidays 节假日数组
 * @return bool
 */
function isNonWorkingDay(DateTime $date, array $holidays): bool
{
    $dayOfWeek = $date->format('N'); // 1=周一,7=周日
    $dateStr = $date->format('Y-m-d');
    return $dayOfWeek >= 6 || in_array($dateStr, $holidays);
}

// 获取初始日期及后续可能顺延范围内的节假日(可按需调整查询范围)
$holidays = fetchHolidays($currentDate, (clone $currentDate)->modify('+7 days'));

// 循环顺延,直到找到第一个工作日
while (isNonWorkingDay($currentDate, $holidays)) {
    $currentDate->modify('+1 day');
}

// 输出最终目标日期(d/m/Y格式)
$targetDate = $currentDate->format('d/m/Y');
echo "最终目标日期:{$targetDate}";
?>

核心逻辑说明

  1. 日期对象处理:使用DateTime类操作日期,避免字符串格式转换的兼容性问题,操作更稳定。
  2. 非工作日统一校验:通过isNonWorkingDay函数一次性判断日期是否为周末或节假日,逻辑清晰。
  3. 循环顺延机制:只要当前日期不符合要求,就自动向后加1天,直到找到首个符合条件的工作日。
  4. 可扩展的节假日查询:fetchHolidays函数可直接替换为项目中的数据库查询逻辑,适配不同业务场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:10:37