Задача общая: добавьте или вычтите месяц к дате, не переходя к следующему месяцу, если дата близка к концу месяца. Для года это прибавить или вычесть 12 месяцев.
Алгоритм функции addMonthCut () был взят здесь .
function addMonthCut(DateTime $date,$month = 1) {
$dateAdd = clone $date;
$dateLast = clone $date;
$strAdd = ' '.(int)$month.' Month';
$strLast = 'last Day of '.(int)$month.' Month';
if ($dateAdd->modify($strAdd) < $dateLast->modify($strLast)) {
$date->modify($strAdd);
}
else {
$date->modify($strLast);
}
return $date;
}
Примеры:
$date = new DateTime('02/29/2020');
$date = addMonthCut($date,-12); //-1 Year
echo $date->format('m/d/Y'); //02/28/2019
$date = new DateTime('02/28/2019');
$date = addMonthCut($date,+12); //+1 Year
echo $date->format('m/d/Y'); //02/28/2020
$date = new DateTime('01/31/2020');
$date = addMonthCut($date,+1); //+1 Month
echo $date->format('m/d/Y'); //02/29/2020