<?php
/**
* Return the next month date given a date and month increment
*
* @param string $date Date to base from in Y-m-d format
* @param integer $increment Number of months to increment
*/
function nextMonth($date, $increment)
{
// Grab the first day of month of the passed in date
$firstOfDateMonth = \DateTime::createFromFormat('Y-m-d', $date)->modify('first day of this month');
// Grab the last day of month of the passed in date
$thirtyFirstOfDateMonth = \DateTime::createFromFormat('Y-m-d', $date)->modify('last day of this month');
// Just get the number of the last day
$thirtyFirstOfDateMonthNum = $thirtyFirstOfDateMonth->format('d');
unset($thirtyFirstOfDateMonth);
// Using the first day of month of the passed in date add month increment and get last day of that month
$thirtyFirstOfNextMonth = $firstOfDateMonth;
unset($firstOfDateMonth);
$thirtyFirstOfNextMonth->modify('+' . (int) $increment . ' month')->modify('last day of this month');
// Just get the number of the last day
$thirtyFirstOfNextMonthNum = $thirtyFirstOfNextMonth->format('d');
// Turn the passed in date into a DateTime object
$dayOfDateMonth = \DateTime::createFromFormat('Y-m-d', $date);
// Just get the number of the day
$dayOfDateMonthNum = $dayOfDateMonth->format('d');
// Using the passed in date add month increment and assume correct so far
$dt = $dayOfDateMonth;
unset($dayOfDateMonth);
$dt->modify('+' . (int) $increment . ' month');
// If the last day of next month < last day of month from passed date && last day of next month < passed date day number
if ($thirtyFirstOfNextMonthNum < $thirtyFirstOfDateMonthNum && $thirtyFirstOfNextMonthNum < $dayOfDateMonthNum) {
// PHP has gone over the date we want so use last day of next month
$dt = $thirtyFirstOfNextMonth;
}
unset($thirtyFirstOfNextMonth);
return $dt->format('Y-m-d');
}
echo nextMonth('2009-12-31', 2),"\n";
echo nextMonth('2010-01-31', 1),"\n";
echo nextMonth('2010-01-05', 1),"\n";
echo nextMonth('2010-12-05', 1),"\n";
echo nextMonth('2010-01-31', 13),"\n";
echo nextMonth('2010-01-31', 3),"\n";
echo nextMonth('2010-01-31', 0),"\n";