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

如何实现日期加一年后默认设为前一个工作日(PHP场景)

实现起始日期加一年后的前一个工作日作为结束日期

需求说明

已知通过strtotime('+1 Weekdays')可获取下一个工作日,现在需要:给定事件起始日期,计算起始日期加一年后的日期,再取该日期的前一个工作日作为结束日期。例如:起始日为周三,一年后同日是周日,则结束日期默认设为前一个周五。

解决方案

方法一:使用strtotime快速实现

利用strtotime的-0 weekdays修饰符,自动将目标日期调整为最近的前一个工作日(若当天是工作日则直接保留):

// 替换为实际的起始日期(可从表单或其他来源获取)
$startDate = '2024-06-19';

// 计算起始日期加一年后的时间戳
$oneYearLater = strtotime('+1 year', strtotime($startDate));

// 调整到前一个工作日(工作日则返回当天,周末返回最近的前一个工作日)
$endTimestamp = strtotime('-0 weekdays', $oneYearLater);

// 格式化为需要的日期格式(这里是d/m/Y)
echo date('d/m/Y', $endTimestamp);

方法二:使用DateTime类(推荐,更直观可控)

通过DateTime类的日期操作和循环判断,手动调整到符合要求的工作日:

// 初始化起始日期对象
$startDate = new DateTime('2024-06-19');

// 复制起始日期并添加一年
$oneYearLater = clone $startDate;
$oneYearLater->add(new DateInterval('P1Y'));

// 循环调整到前一个工作日
$endDate = clone $oneYearLater;
do {
    // 获取ISO星期几:1=周一,5=周五,6=周六,7=周日
    $dayOfWeek = $endDate->format('N');
    if ($dayOfWeek <= 5) {
        break;
    }
    // 非工作日则减一天
    $endDate->sub(new DateInterval('P1D'));
} while (true);

// 输出格式化后的结束日期
echo $endDate->format('d/m/Y');

注意事项

  • 两种方法都能自动处理闰年特殊情况(如2月29日加一年后变为3月1日)。
  • 若需要排除节假日(而非仅周末),需额外维护节假日数组,在循环中增加判断逻辑。
  • 可根据需求修改日期输出格式(如Y-m-d)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:20:32