2010-06-13 5 views
6

Tengo dos objetos de la clase Zend_Date y quiero calcular la diferencia entre ellos en meses calendario completos ... ¿Cómo puedo hacer esto?cómo calcular una diferencia entre dos objetos Zend_Date, en los meses

<?php 
$d1 = new Zend_Date('1 Jan 2008');  
$d2 = new Zend_Date('1 Feb 2010'); 
$months = $d1->sub($d2)->get(Zend_Date::MONTH); 
assert($months == -25); // failure here 

¡Gracias de antemano!

+0

Estoy sospechando que, dado que el valor devuelto es probablemente un Zend_Date el '$ months' var nunca será más de 12 ... (o 11 , si está basado en 0) –

Respuesta

13

Si leo los documentos correctamente, no hay ninguna funcionalidad implementada para obtener la diferencia entre 2 fechas en segundos/minutos /.../meses/años, por lo que tendrá que calcularlo usted mismo. Algo como esto va a hacer (¡no sé si se necesitan años bisiestos, el horario de verano y tales en consideración):

<?php 
$d1 = new Zend_Date('1 Jan 2008');  
$d2 = new Zend_Date('1 Feb 2010'); 
$diff = $d1->sub($d2)->toValue(); 
$months = floor(((($diff/60)/60)/24)/30); 
+0

Suena como una solución muy difícil ... El resultado no será el correcto ... – yegor256

+0

bueno, este ejemplo da 25 para el resultado final ... Al final, depende de usted decida la mejor respuesta =) – robertbasic

+0

no puede obtener mucho mejor que esto sin cálculos "complejos" (una función diseñada para esto) –

1

Para todos aquellos que buscan obtener una salida amistosa (días, horas, minutos, segundos) Comparto mi código aquí:

function _getDelay($since) { 
    $timeNow = new Zend_Date(); 
    $timeThen = new Zend_Date($since); 
    $difference = $timeNow->sub($timeThen); 
    return $difference->toValue(); 
} 

function _friendlySeconds($allSecs) { 
    $seconds = $allSecs % 60; $allMinutes = ($allSecs - $seconds)/60; 
    $minutes = $allMinutes % 60; $allHours = ($allMinutes - $minutes)/60; 
    $hours = $allHours % 24; $allDays = ($allHours - $hours)/24; 
    return ($allDays > 0 ? $allDays . "d" : "") . 
      ($hours > 0 ? $hours . "h" : "") . 
      ($minutes > 0 ? $minutes . "m" : "") . $seconds . "s"; 
} 

Sólo tiene que llamar esto algo como como:

echo "It happened " . _friendlySeconds(_getDelay('2010-11-18')) . " ago."; 
0

que solía hacer esto tomando la diferencia entre dos fechas Zend, pero que es muy complejo como Elzo valugi con razón señala anteriormente. Mejor usa el enfoque humano. Su edad en años es la diferencia entre las partes del año de ambas fechas si su día de nacimiento ya ha sido, si no, un año menos. Algo similar se puede hacer con meses.

function age($birthDate, $date) 
    {  
     $age = $date->get(Zend_Date::YEAR) - $birthDate->get(Zend_Date::YEAR); 
     $birthDay = clone $birthDate; // otherwise birthDate will be altered, objects are always passed by reference in PHP 5.3    
     $birthDay->set($date, Zend_Date::YEAR); // birthDay in the year of $date 
     if (1 == $BirthDay->compare($date)) { 
      $age = $age -1; // if birth day has not passed yet 
     } 
     return $age; 
    } 
1

Gracias, su respuesta me ayudó a resolver el robertbasic problema, esto es lo que solía resolver mi código:

$dob = $post ['dob']; 
$date = Zend_Date::now(); 
$date3 = new Zend_Date ("$dob", 'MM.dd.yyyy'); 
$diff = $date->sub ($date3)->toValue(); 

echo $age = floor (((($diff/60)/60)/24)/365); 
16

Con la ayuda de Zend_Measure_Time puede obtener fácilmente cualquier diferencia que desee:

$timeNow = new Zend_Date(); 
    $timeThen = new Zend_Date("2011-05-21T10:30:00"); 
    $difference = $timeNow->sub($timeThen); 

    $measure = new Zend_Measure_Time($difference->toValue(), Zend_Measure_Time::SECOND); 
    $measure->convertTo(Zend_Measure_Time::MONTH); 

    echo $measure->getValue(); 

¡No es necesario realizar cálculos complicados!

1

Se puede conseguir usando una fórmula simple:

$diffInMonth = ($startYear == $endYear) ? 
       $endMonth - $startMonth + 1 : 
       (($endYear - $startYear) * 12) - $startMonth + $endMonth + 1; 
Cuestiones relacionadas