本文介绍如何在 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 查询中,构建灵活可靠的排课引擎。