2010-06-13 16 views
6

Ich habe zwei Objekte Zend_Date Klasse und ich möchte den Unterschied zwischen ihnen in vollen Kalendermonaten berechnen .. Wie kann ich das tun?wie man einen Unterschied zwischen zwei Zend_Date Objekten berechnet, in Monaten

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

Vielen Dank im Voraus!

+0

ich den Verdacht, da der Rückgabewert ein wahrscheinlich ein Zend_Date ist das '$ months' var wird nie mehr als 12 ... (oder 11 , wenn es 0 basiert) –

Antwort

13

Wenn ich die Dokumente richtig lese, gibt es keine implementierten Funktionen, um den Unterschied zwischen zwei Daten in Sekunden/Minuten /.../ Monaten/Jahren zu ermitteln. Sie müssen diese also selbst berechnen. So etwas wie dies tun wird (weiß nicht, ob es Schaltjahre dauert, DST und solche in Betracht):

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

Klingt wie eine sehr grobe Lösung .. Das Ergebnis wird nicht richtig sein. – yegor256

+0

gut, dieses Beispiel gibt 25 für das Endergebnis ... Am Ende liegt es an Ihnen zu entscheiden Sie sich für die beste Antwort =) – robertbasic

+0

Sie können nicht viel besser als das ohne "komplexe" Berechnungen (eine Funktion dafür) –

1

Für alles eine freundliche Ausgabe (Tage, Stunden, Minuten, Sekunden) zu erhalten sucht ich meinen Code hier teilen:

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

rufen Sie einfach diese so etwas wie wie:

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

habe ich dies zu tun, indem die Differenz zwischen zwei Zend Daten nehmen, aber das ist sehr komplex wie Elzo Valugi zu Recht oben bemerkt. Besser den menschlichen Ansatz anwenden. Dein Alter in Jahren ist der Unterschied zwischen den Jahresanteilen beider Daten, wenn dein Geburtsdatum bereits abgelaufen ist, wenn nicht sogar ein Jahr weniger. Ähnliches kann mit Monaten gemacht werden.

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

Dank, Ihre Antwort hat mir geholfen, das Problem robertbasic zu lösen, ist es das, was ich verwendet, meinen Code zu lösen:

$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

Mit Hilfe von Zend_Measure_Time Sie leicht einen Unterschied Sie wollen, erhalten:

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

Keine Notwendigkeit für komplizierte Berechnungen!

1

Sie können es einfache Formel erhalten werden: dass

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