que necesitaba una funcionalidad similar, a excepción de un ciclo mensual (más meses, menos 1 día). Después de buscar S.O. por un tiempo, yo era capaz de elaborar esta solución plug-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;
}
Ejemplo:
$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
No funciona con todas las fechas. Por ejemplo, 2013-05-31 mostrará julio en lugar del mes siguiente, que es junio. –
Me estoy siguiendo, 2014-03-03 para 2014-01-31 razón? –
No funcionó con esta cadena: "2014-06-19 15:00:19" –