本文介绍如何使用 php 的 datetime 和 dateperiod 类,准确生成从起始日到结束日之间每周固定星期几(如每周三)的所有日期,并解决因变量作用域导致的返回空值问题。
在开发课程排期、预约系统或周期性任务

以下是一个健壮、可复用的解决方案:
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 项目中,支撑学生课表、教师排班、活动提醒等核心业务场景。