本文介绍一种简洁可靠的 php 方法,用于从起始日期开始,按时间顺序获取指定星期几(如周二、周四)的接下来 n 个日期,避免复杂循环与区间跳跃逻辑。
在实际开发中,常需生成“未来第 N 个周二和周四”这类序列(例如预约系统、课程排期、邮件提醒等场景)。核心难点在于:不能简单按周递增(否则会跳过同周内多个目标星期几),而必须逐日推进、实时判断是否匹配目标星期几,并严格按自然时间顺序收集结果。
以下是一个轻量、健壮且易扩展的实现方案:
function getNextWeekdayDates(string $startDate, int $count, array $targetDays): array
{
// 支持英文全称或缩写(Tue/Tuesday, Thu/Thursday 等)
$normalizedTargets = array_map(function($d) {
return strtoupper(substr(trim($d), 0, 3));
}, $targetDays);
$date = date_create($startDate);
if (!$date) {
throw new InvalidArgumentException("Invalid start date: {$startDate}");
}
$result = [];
while ($count > 0 && $date !== false) {
$dayCode = $date->format('D'); // 返回 'Mon', 'Tue', ..., 'Sun'
if (in_array($dayCode, $normalizedTargets)) {
$result[] = [
'date' => $date->format('d/m/Y'),
'day' => $dayCode
];
$count--;
}
$date->modify('+1 day');
}
return $result;
}
// 使用示例
$dates = getNextWeekdayDates('02/08/2025', 5, ['Tuesday', 'Thursday']);
foreach ($dates as $item) {
echo "{$item['date']} - {$item['day']}\n";
}✅ 输出结果(符合预期):
08/02/2025 - Tue 10/02/2025 - Thu 15/02/2025 - Tue 17/02/2025 - Thu 22/02/2025 - Tue
? 关键设计说明:
:避免预设“每周取几个”的假设,确保同周内多个目标日(如某周既有 Tue 又有 Thu)被正确捕获; ⚠️ 注意事项:
该方法以清晰逻辑替代复杂状态管理,兼顾可读性、鲁棒性与实用性,是处理周期性工作日计算的推荐实践。