potrzebowałem podobną funkcjonalność, z wyjątkiem cyklu miesięcznym (plus miesięcy minus 1 dzień). Po przeszukaniu S.O. przez pewien czas, to w stanie jednostek tego rozwiązania wtyk-n-play:
function add_months($months, DateTime $dateObject)
{
$next = new DateTime($dateObject->format('Y-m-d'));
$next->modify('last day of +'.$months.' month');
if($dateObject->format('d') > $next->format('d')) {
return $dateObject->diff($next);
} else {
return new DateInterval('P'.$months.'M');
}
}
function endCycle($d1, $months)
{
$date = new DateTime($d1);
// call second function to add the months
$newDate = $date->add(add_months($months, $date));
// goes back 1 day from date, remove if you want same day of month
$newDate->sub(new DateInterval('P1D'));
//formats final date to Y-m-d form
$dateReturned = $newDate->format('Y-m-d');
return $dateReturned;
}
Przykład:
$startDate = '2014-06-03'; // select date in Y-m-d format
$nMonths = 1; // choose how many months you want to move ahead
$final = endCycle($startDate, $nMonths); // output: 2014-07-02
To nie działa z całą datą. Na przykład 2013-05-31 wyświetli się lipiec zamiast następnego miesiąca, czyli czerwca. –
Dostaję następujące, 2014-03-03 na 2014-01-31 powodu? –
To nie działało z tym ciągiem: "2014-06-19 15:00:19" –