A ver te explico el código que te funcionó:
Código PHP:
Ver originalfunction masxmeses3($fecha, $meses) {
//sacamos con explode la fecha separada en dia-mes-año
$fe_i = mktime(0, 0, 0, $f[1], $f[0], $f[2]); //se lo pasamos a mktime como fecha inicial $f[1] = mes,
//$f[0] = dia, $f[2] = año, así como lo pide mktime que se lo
//pasemos.
$masxmeses = mktime(0, 0, 0, $f[1]+$meses, $f[0], $f[2]); //sumamos los meses $f[1]+$meses
if (date('j', $fe_i) != date('j', $masxmeses)) { return date('t-m-Y', mktime(0, 0, 0, $f[1]+$meses, ($f[0]-date('j', $fe_i))+1, $f[2])); }
//Comparamos si el día inicial es diferente al día final (la j en date es el día del mes sin ceros iniciales),
//si lo es, es porque se pasó a otro mes y en ese caso lo debemos devolver.
//return del condicional lo que hace es, sumar los meses pero restarle los días
//que nos sobran para que se devuelva a 28 (o lo que necesite) eso hace
//($f[0]-date('j', $fe_i))+1
//t-m-Y la t en el date es el último día del mes
return date('d-m-Y', $masxmeses); //en caso de que los días sean iguales lo devolvemos normal,
//sumando los 2 meses.
}
echo masxmeses3('31-12-2012', 2); //28-02-2013
creo que DateTime te falla porque en esa versión no se permite esto:
Código PHP:
Ver originalreturn $dt->modify("-$masxmeses days")->format($formato);
Puedes probar así:
Código PHP:
Ver originalfunction masxmeses4($fecha, $meses, $formato) {
$dt = new DateTime($fecha);
//inicializamos el objeto DateTime con la fecha
$fe_i = $dt->format('j');
//sacamos el día de esa fecha inicial
$dt->modify("+$meses month");
//le sumamos los meses a esa fecha inicial
$masxmeses = $dt->format('j');
//sacamos el día que nos dió al sumarle los meses
if ($fe_i != $masxmeses) {
//si son diferentes (se pasó a otro mes)
$dt->modify("-$masxmeses days");
//le restamos los días que se pasó
return $dt->format($formato);
//devolvemos esa fecha restandole los días
}
//si son iguales los dias es porque no se pasó
//devolvemos la fecha + 2 meses
return $dt->format($formato);
}
echo masxmeses4('31-12-2012', 2, 'd-m-Y'); //28-02-2013
Cualquier cosa comenta.
Saludos.