如何在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}"; ?>
核心逻辑说明
- 日期对象处理:使用
DateTime类操作日期,避免字符串格式转换的兼容性问题,操作更稳定。 - 非工作日统一校验:通过
isNonWorkingDay函数一次性判断日期是否为周末或节假日,逻辑清晰。 - 循环顺延机制:只要当前日期不符合要求,就自动向后加1天,直到找到首个符合条件的工作日。
- 可扩展的节假日查询:
fetchHolidays函数可直接替换为项目中的数据库查询逻辑,适配不同业务场景。
内容的提问来源于stack exchange,提问作者Demi God
相关产品推荐
相关产品推荐

