贝利信息

如何在 PHP 中生成指定日期范围内每周特定星期几的所有日期

日期:2026-01-25 00:00 / 作者:碧海醫心

本文介绍如何使用 php 的 datetime 和 dateperiod 类,准确生成从起始日到结束日之间每周固定星期几(如每周三)的所有日期,并解决因变量作用域导致的返回空值问题。

在开发课程排期、预约系统或周期性任务调度功能时,常需动态计算“某段时间内每周某一天”的所有具体日期(例如:2025年2月20日至4月1日之间的所有星期三)。PHP 提供了强大的日期处理类,但初学者易忽略关键细节——变量作用域日期逻辑

边界处理

以下是一个健壮、可复用的解决方案:

function getWeeklyDates($start, $end, $targetDay) {
    $begin = new DateTime($start);
    $end = new DateTime($end);

    // 确保起始日期不晚于结束日期
    if ($begin > $end) {
        return [];
    }

    // 调整 begin 到第一个匹配的目标星期几(如 'next Wednesday')
    $firstTarget = clone $begin;
    $firstTarget->modify($targetDay);

    // 若调整后已超过 end,则无有效日期
    if ($firstTarget > $end) {
        return [];
    }

    // 以 P1W(每周)为间隔构造 DatePeriod
    $interval = new DateInterval('P1W');
    $period = new DatePeriod($firstTarget, $interval, $end);

    $dates = [];
    foreach ($period as $date) {
        $dates[] = $date->format('d-m-Y');
    }

    return $dates;
}

// 示例调用:获取 2025-02-20 至 2025-04-01 之间的所有星期三
$result = getWeeklyDates('2025-02-20', '2025-04-01', 'next wednesday');
print_r($result);

关键改进说明:

⚠️ 注意事项:

该方法简洁、高效且符合 PSR-12 编码规范,可直接集成至 Laravel、Symfony 或原生 PHP 项目中,支撑学生课表、教师排班、活动提醒等核心业务场景。