Мне нужно было сделать то же самое, но диапазоны по две недели. Чтобы было по одной неделе, то надо просто убрать addWeek(). Сделал на Carbon вот так:
function getWeekPeriods(Carbon $from, Carbon $to)
{
$weeks = [];
$currentDate = $from;
while ($to->greaterThan($currentDate)) {
$currentDate = $currentDate->startOfDay();
$endOfTwoWeeksRange = (clone $currentDate)->addWeek()->endOfWeek();
if ($endOfTwoWeeksRange->greaterThan($to)) {
$weeks[] = ['start' => $currentDate->isoFormat('DD.MM.Y HH:mm:ss'), 'end' => $to->isoFormat('DD.MM.Y HH:mm:ss')];
break;
}
$weeks[] = ['start' => $currentDate->isoFormat('DD.MM.Y HH:mm:ss'), 'end' => $endOfTwoWeeksRange->isoFormat('DD.MM.Y HH:mm:ss')];
$currentDate = $endOfTwoWeeksRange->addDay();
}
return $weeks;
}
Запрос:
{
"date_from":"2023-01-03",
"date_to":"2023-02-28"
}
Ответ:
[
{
"start": "03.01.2023 00:00:00",
"end": "15.01.2023 23:59:59"
},
{
"start": "16.01.2023 00:00:00",
"end": "29.01.2023 23:59:59"
},
{
"start": "30.01.2023 00:00:00",
"end": "12.02.2023 23:59:59"
},
{
"start": "13.02.2023 00:00:00",
"end": "26.02.2023 23:59:59"
},
{
"start": "27.02.2023 00:00:00",
"end": "28.02.2023 10:00:00"
}
]