本文介绍一种简洁可靠的 php 方法,用于从起始日期开始,按顺序获取指定星期几(如周二、周四)的接下来 n 个日期,支持任意组合与数量,代码清晰、逻辑直观、易于扩展。
在日常开发中,我们常需生成特定星期几的未来日期序列(例如:每周二和周四共 5 次会议安排)。核心难点在于:不能简单按周循环(易跳过或重复),而应逐日推进、动态匹配目标星期几,并严格按时间顺序累积结果。
以下是一个高效、可读性强且鲁棒的实现方案:
function getNextWeekdayDates(string $startDate, int $count, array $targetDays): array
{
// 支持英文全称或缩写(如 'Tuesday'/'Tue', 'Thursday'/'Thu')
$normalize = function($day) {
$map = [
'mon' => 'Mon', 'monday' => 'Mon',
'tue' => 'Tue', 'tuesday' => 'Tue',
'wed' => 'Wed', 'wednesday' => 'Wed',
'thu' => 'Thu', 'thursday' => 'Thu',
'fri' => 'Fri', 'friday' => 'Fri',
'sat' => 'Sat', 'saturday' => 'Sat',
'sun' => 'Sun', 'sunday' => 'Sun'
];
return $map[strtolower(trim($day))] ?? strtoupper(substr(trim($day), 0, 3));
};
$weekDays = array_map($normalize, $targetDays);
$dates = [];
$date = date_create($startDate);
if (!$date) {
throw new InvalidArgumentException("Invalid start date: {$startDate}");
}
while ($count > 0 && $date !== false) {
$dayOfWeek = $date->format('D');
if (in_array($dayOfWeek, $weekDays)) {
$dates[] = [
'date' => $date->format('d/m/Y'),
'day' => $dayOfWeek
];
$count--;
}
$date->modify('+1 day');
}
return $dates;
}
// 使用示例
$result = getNextWeekdayDates('02/08/2025', 5, ['Tue', 'Thu']);
foreach ($result 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
该方法摒弃了复杂的时间间隔计算与嵌套循环,回归问题本质——线性扫描 + 条件收集,是解决此类“按星期几生成有序日期序列”需求的推荐实践。