贝利信息

PHP 中生成指定周几的周期性日期序列(如每周一、每周三等)

日期:2026-01-25 00:00 / 作者:霞舞

本文介绍如何在 php 中正确生成两个日期之间特定星期几的所

有日期,并解决因变量作用域导致的返回值为空问题。

在开发课程排期、预约系统或日程管理功能时,常需计算“从某日起,每周固定星期几”的所有日期(例如:2025-02-20 至 2025-04-01 之间的所有周三)。初学者常误用 DatePeriod 配合 modify() 实现该逻辑,但易忽略关键细节——变量作用域日期偏移逻辑的健壮性

以下是一个修复后、生产可用的函数示例:

function getWeeklyDates($startDate, $endDate, $targetDay)
{
    // 创建 DateTime 对象并标准化输入(不依赖 modify 的模糊语义)
    $start = new DateTime($startDate);
    $end   = new DateTime($endDate);

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

    // 先将起始日期调整为第一个目标星期几(如 'next Wednesday')
    $firstTarget = clone $start;
    $firstTarget->modify($targetDay);

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

    // 以目标日为起点,按周递增生成日期序列
    $dates = [];
    $current = $firstTarget;

    while ($current <= $end) {
        $dates[] = $current->format('d-m-Y');
        $current->modify('+1 week');
    }

    return $dates;
}

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

关键改进说明:

⚠️ 注意事项:

掌握此模式后,你可轻松扩展为多日组合(如“每周二、四”)、排除节假日,或集成进 Laravel/Eloquent 查询中,构建灵活可靠的排课引擎。