2010-06-13 13 views
6

Mam dwa obiekty klasy Zend_Date i chcę obliczyć różnicę między nimi w pełnych miesiącach kalendarzowych .. Jak mogę to zrobić?jak obliczyć różnicę między dwoma obiektami Zend_Date, w miesiącach

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

Z góry dziękuję!

+0

mi podejrzewać, że skoro zwracana wartość jest prawdopodobnie Zend_Date Opcja '$ months' var nigdy nie będzie więcej niż 12 ... (lub 11 , jeśli jest w oparciu 0) –

Odpowiedz

13

Jeśli poprawnie odczytuję dokumenty, nie ma zaimplementowanej funkcji uzyskiwania różnicy między 2 datami w sekundach/minutach /.../ mies./Latach, więc trzeba to obliczyć samodzielnie. Coś jak to zrobi (dunno jeśli trwa lata przestępne, DST i takie pod uwagę):

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

Brzmi jak bardzo szorstkie rozwiązanie .. Wynik nie będzie odpowiedni .. – yegor256

+0

cóż, ten przykład daje 25 dla wyniku końcowego ... W końcu, to do ciebie należy zdecydować się na najlepszą odpowiedź =) – robertbasic

+0

nie można uzyskać znacznie lepiej niż to bez "skomplikowanych" obliczeń (funkcja przeznaczona do tego celu) –

1

Dla każdego, kto chce dostać wyjście przyjazną (dni, godziny, minuty, sekundy) dzielę kod tutaj:

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

Wystarczy zadzwonić to coś takiego jak:

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

kiedyś zrobić to poprzez różnicę między dwiema datami Zend, ale to jest bardzo skomplikowane, jak słusznie zauważa Elzo Valugi powyżej. Lepiej wykorzystaj ludzkie podejście. Twój wiek w latach jest różnicą między częściami rocznymi obu dat, jeśli twój dzień urodzenia był już, jeśli nie, rok krócej. Coś podobnego można zrobić z miesiącami.

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

Dzięki, odpowiedź pomogła mi rozwiązać robertbasic problemu, to co kiedyś rozwiązać mój kod:

$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

Z pomocą Zend_Measure_Time można łatwo dostać żadnej różnicy chcesz:

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

Nie trzeba wykonywać skomplikowanych obliczeń!

1

można dostać go za pomocą prostego wzoru:

$diffInMonth = ($startYear == $endYear) ? 
       $endMonth - $startMonth + 1 : 
       (($endYear - $startYear) * 12) - $startMonth + $endMonth + 1; 
Powiązane problemy