Задать вопрос
@alexandrtumaykin
PHP-программист

PHP. Есть ли решение, которое будет разбивать интервал дат на недельные периоды?

нужно придумать алгоритм, который будет разбивать интервал дат на недельные периоды. Неделей считается интервал от пн по вс либо текущего дня по вс (например, если первое число месяца выпадает на отличный от пн день) либо пн по текущий день (если конец месяца выпадает на день отличный от вс).

Пример:

входные данные 01.08.2014 - 30.08.2015

на выходе:

01.08.2014 - 03.08.2014

04.08.2014 - 10.08.2014

11.08.2014 - 17.08.2014

18.08.2014 - 24.08.2014

25.08.2014 - 31.08.2014

01.09.2014 - 07.09.2014

...

29.09.2014 - 30.09.2014

01.10.2014 - 05.10.2014

06.10.2014 - 12.10.2014

...
  • Вопрос задан
  • 2999 просмотров
Подписаться 1 Оценить Комментировать
Ответ пользователя VlasTeLiNandCPONK К ответам на вопрос (5)
@VlasTeLiNandCPONK
Мне нужно было сделать то же самое, но диапазоны по две недели. Чтобы было по одной неделе, то надо просто убрать 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"
    }
]
Ответ написан
Комментировать