Ver Mensaje Individual
  #13 (permalink)  
Antiguo 21/01/2013, 11:28
Avatar de andresdzphp
andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Problema con Funcion de sumar fechas

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

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.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 21/01/2013 a las 11:34