2010-06-13 23 views
6

Ho due oggetti della classe Zend_Date e voglio calcolare la differenza tra loro in interi mesi di calendario .. Come posso fare questo?come calcolare una differenza tra due oggetti Zend_Date, in mesi

<?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 

Grazie in anticipo!

+0

Sono sospettare che, poiché il valore restituito è un probabilmente uno Zend_Date il '$ months' var non sarà mai più di 12 ... (o 11 , se è basato su 0) –

risposta

13

Se leggo correttamente i documenti, non ci sono funzionalità implementate per ottenere la differenza tra 2 date in secondi/minuti/.../mesi/anni, quindi è necessario calcolare da soli. Qualcosa di simile lo farà (so se ci vogliono anni bisestili, DST e quali in considerazione):

<?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

Sembra una soluzione molto approssimativa .. Il risultato non sarà corretto .. – yegor256

+0

beh, questo esempio dà 25 per il risultato finale ... Alla fine, spetta a te decidere per la risposta migliore =) – robertbasic

+0

non si può ottenere molto meglio di questo senza calcoli "complessi" (una funzione progettata per questo) –

1

Per coloro che cercano di ottenere un'uscita amichevole (giorni, ore, minuti, secondi) Condivido il mio codice qui:

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"; 
} 

Basta chiamare questo qualcosa come come:

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

ho usato per fare questo prendendo la differenza tra due date Zend, ma che è molto complesso come Elzo valugi giustamente osservazioni di cui sopra. Meglio usare l'approccio umano. La tua età in anni è la differenza tra le parti dell'anno di entrambe le date se il tuo giorno di nascita è già stato, in caso contrario, un anno in meno. Qualcosa di simile può essere fatto con mesi.

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

Grazie, la tua risposta mi ha aiutato a risolvere il problema robertbasic, questo è quello che ho usato per risolvere il mio codice:

$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 l'aiuto di Zend_Measure_Time si può facilmente ottenere alcuna differenza che si desidera:

$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(); 

Non sono necessari calcoli complicati!

1

Si può ottenere usando semplice formula:

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