Laravel 如何根据指定月份的周数获取对应日期范围
Laravel 实现指定年月周次返回对应日期列表方案
Laravel 内置 Carbon 日期处理库,无需额外安装扩展即可完成需求,实现逻辑如下:
核心功能代码
use Carbon\Carbon; /** * 根据传入的年、月、周次返回对应周的全部日期 * @param int $year 年份 * @param int $month 月份 * @param int $weekNumber 当月周次 * @return array */ function getWeekDates(int $year, int $month, int $weekNumber): array { // 获取当月第一天 $firstDayOfMonth = Carbon::create($year, $month, 1); // 配置周起始为周日、周结束为周六,和示例输出规则匹配 $firstWeekStart = $firstDayOfMonth->copy()->startOfWeek(Carbon::SUNDAY); // 适配常用计数规则:当月第一周为包含当月日期的第一个完整周 if ($firstWeekStart->month !== $month) { $firstWeekStart->addWeek(); } // 计算目标周的起止日期 $targetWeekStart = $firstWeekStart->copy()->addWeeks($weekNumber - 1); $targetWeekEnd = $targetWeekStart->copy()->endOfWeek(Carbon::SATURDAY); // 生成日期列表 $dates = []; for ($currentDate = $targetWeekStart->copy(); $currentDate->lte($targetWeekEnd); $currentDate->addDay()) { // 直接返回Y-m-d格式日期,如需中文格式可替换为 $currentDate->format('Y年m月d日') $dates[] = $currentDate->toDateString(); // 如需仅保留当月日期,可打开下方注释 // if ($currentDate->month === $month) { // $dates[] = $currentDate->toDateString(); // } } return $dates; }
注意:如果你所在地区的周起始规则为周一,只需要将代码中的
startOfWeek(Carbon::SUNDAY)修改为startOfWeek(Carbon::MONDAY),endOfWeek(Carbon::SATURDAY)修改为endOfWeek(Carbon::SUNDAY)即可。
调用示例
传入示例参数即可得到对应结果:
$weekDates = getWeekDates(2021, 10, 2); // 输出结果:["2021-10-10","2021-10-11","2021-10-12","2021-10-13","2021-10-14","2021-10-15","2021-10-16"]
自然语言输入解析
如果需要直接解析「2021年10月第2周」这类字符串格式的输入,可以增加以下正则提取逻辑:
function parseWeekText(string $input): ?array { if (preg_match('/(\d{4})年(\d{1,2})月第(\d{1,2})周/', $input, $matches)) { return [ 'year' => (int)$matches[1], 'month' => (int)$matches[2], 'week' => (int)$matches[3], ]; } return null; } // 调用示例 $params = parseWeekText('2021年10月第2周'); if ($params) { $weekDates = getWeekDates($params['year'], $params['month'], $params['week']); }
内容的提问来源于stack exchange,提问作者Zacharias Hendrik
相关产品推荐
相关产品推荐

