Ver Mensaje Individual
  #15 (permalink)  
Antiguo 21/01/2013, 13:08
rbczgz
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 6 meses
Puntos: 154
Respuesta: Problema con Funcion de sumar fechas

Genial!! Muchas gracias por la explicación.

Cita:
Iniciado por andresdzphp Ver Mensaje
A ver te explico el código que te funcionó:

Código PHP:
Ver original
  1. function masxmeses3($fecha, $meses) {
  2.     $f = explode('-', $fecha);
  3.     //sacamos con explode la fecha separada en dia-mes-año
  4.     $fe_i = mktime(0, 0, 0, $f[1], $f[0], $f[2]);
  5.     //se lo pasamos a mktime como fecha inicial $f[1] = mes,
  6.     //$f[0] = dia,  $f[2] = año, así como lo pide mktime que se lo  
  7.     //pasemos.
  8.     $masxmeses = mktime(0, 0, 0, $f[1]+$meses, $f[0], $f[2]);
  9.     //sumamos los meses $f[1]+$meses
  10.  
  11.     if (date('j', $fe_i) != date('j', $masxmeses)) {
  12.         return date('t-m-Y', mktime(0, 0, 0, $f[1]+$meses, ($f[0]-date('j', $fe_i))+1, $f[2]));
  13.     }
  14.     //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),
  15.     //si lo es, es porque se pasó a otro mes y en ese caso lo debemos devolver.
  16.    
  17.     //return del condicional lo que hace es, sumar los meses pero restarle los días
  18.     //que nos sobran para que se devuelva a 28 (o lo que necesite) eso hace
  19.     //($f[0]-date('j', $fe_i))+1
  20.    
  21.     //t-m-Y la t en el date es el último día del mes
  22.    
  23.     return date('d-m-Y', $masxmeses);
  24.     //en caso de que los días sean iguales lo devolvemos normal,
  25.     //sumando los 2 meses.
  26. }
  27.  
  28. 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 Ver Mensaje
creo que DateTime te falla porque en esa versión no se permite esto:

Código PHP:
Ver original
  1. return $dt->modify("-$masxmeses days")->format($formato);

Puedes probar así:

Código PHP:
Ver original
  1. function masxmeses4($fecha, $meses, $formato) {
  2.       $dt = new DateTime($fecha);
  3.       //inicializamos el objeto DateTime con la fecha
  4.       $fe_i = $dt->format('j');
  5.       //sacamos el día de esa fecha inicial
  6.      
  7.       $dt->modify("+$meses month");
  8.       //le sumamos los meses a esa fecha inicial
  9.       $masxmeses = $dt->format('j');
  10.       //sacamos el día que nos dió al sumarle los meses
  11.      
  12.       if ($fe_i != $masxmeses) {
  13.           //si son diferentes (se pasó a otro mes)
  14.           $dt->modify("-$masxmeses days");
  15.           //le restamos los días que se pasó
  16.           return $dt->format($formato);
  17.           //devolvemos esa fecha restandole los días
  18.       }
  19.      
  20.       //si son iguales los dias es porque no se pasó
  21.       //devolvemos la fecha + 2 meses
  22.       return $dt->format($formato);
  23. }
  24.  
  25. 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 Ver Mensaje
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.

.