@vladislav997

Как в данном случае корректно поправить дату?

Такой вопрос, есть дата, например 2020-06-15. Нужно добавить по одному месяцу на год вперед, а также изменить число на последний день месяца. То есть в итоге должно получится:
2020-06-15 (первая дата)
2020-07-31 (в июле 31 день)
2020-08-31 (в августе 31 день)
2020-09-30 (в сентябре 30 дней)
2020-10-31 (в октябре 31 день)
и так далее до июля 22 года.

Пробую так:
//
            foreach ($getDates as $getDate) {
                # предположим что в getDate лежит - 2020-06-15
                $firstDate = new \DateTime($getDate);
                $datesArr[] = $firstDate->format('Y-m-d');
                    for ($i = 1; $i <= 12; $i++) {
                        $date = new \DateTime($getDate);

                        $month = $date->format('F');
                        $year = $date->format('Y');

                        $date->modify("+$i month");
                        # до этого момента все хорошо, прибавляется по одному мес на год вперед
                        $date->modify("last day of $month $year");
                        # здесь уже все ломается, хотя в доке указано "last day of July 2008"
                        $datesArr[] = $date->format('Y-m-d');
                    }
            }

но это не совсем корректно работает. после строчки modify("last day of $month $year"); подскажите как поправить?
  • Вопрос задан
  • 39 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Mellorn
Набросал на коленке.
Нужно примерно такое?
$dates = [
    '2021-05-05', '2021-06-06',
];
$result = [];

foreach ($dates as $strDate) {
    $date = new DateTimeImmutable($strDate);

    // Записываем исходную дату как есть, значение = $strDate.
    $result[] = $date->format('Y-m-d');

    for ($i = 1; $i <= 12; ++$i) {
        // Записываем дату со смещением на соответствующее количество месяцев относительно исходной, где день = последнему дню месяца.
        $result[] = $date->modify("+{$i} month last day of")->format('Y-m-d');
    }
}

print_r($result);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы