Genial!! Muchas gracias por la explicación.
Cita:
Iniciado por andresdzphp
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
¿Sabes que te podrías ganar la vida dando clases? Se entiende todo perfectamente.
De hecho, si los moderadores (no sé si los colaboradores también podéis) lo aprueban, creo que se debería extractar y colocar como aporte, con su explicación y todo, porque está fantástica.
Cita:
Iniciado por andresdzphp
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.
Así sí que ha funcionado perfectamente también, me quedo con la otra, pero esta también funciona así.
Y puestos a rizar el rizo, como aprendizaje y por si se quiere poner como aporte ¿se podría modificar para que admitiera la suma de días, meses y años o solo de alguna de las opciones?
Esto no me hace falta ahora mismo, pero siempre está bien aprender, y si se puede, pues más que aprenderemos... y si además, se coloca como aporte, pues estará más completo...
¡¡¡Un millón de gracias!!!
Cita:
Iniciado por abimaelrc
Tambien es posible usar strtotime junto con date o datetime así como en el ejemplo que te expusieron anterior a este comentario
Gracias por la idea abimaelrc, pero, como decía en un post anterior, no trabajo mucho con fechas más allá de mostrarlas y guardarlas, se me escapa a mis conocimientos.
.