2010-06-13 102 views
6

我有兩個對象Zend_Date類,我想計算他們之間的完整日曆月之間的差異..我怎麼能做到這一點?如何計算兩個Zend_Date對象之間的差異,以月爲單位

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

在此先感謝!

+0

我懷疑,因爲返回的值是可能是Zend_Date的運算的'$ months'變種永遠不會多於12 ...(或11 ,如果它是0) – 2010-06-13 12:29:43

回答

13

如果我正確地閱讀了文檔,沒有實現的功能可以在秒/分/秒/月/年之間獲得兩個日期之間的差異,所以您需要自己計算它。像這樣的東西會做(說不上來,如果它需要閏年,DST和這樣的考慮):

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

聽起來像一個非常粗糙的解決方案..結果不會是正確的.. – yegor256 2010-06-13 12:26:05

+0

好吧,這個例子確實給了25的最終結果......最後,這取決於你決定最佳答案=) – robertbasic 2010-06-13 15:05:11

+0

如果沒有「複雜」計算(爲此設計的函數),你無法比這更好。 – 2011-03-03 13:52:33

1

對於任何人都希望得到我在這裏分享我的代碼友好的輸出(日,時,分,秒):

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

只需撥打這個類似像:

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

我使用以兩個Zend的日期,但是,這是非常複雜的Elzo Valugi正確上述言論之差要做到這一點。更好地使用人性化的方法。你的年齡是兩個日期的年份之間的差額,如果你的出生日期已經,如果不是,則減少一年。類似的事情可以用幾個月來完成。

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

謝謝,你的回答幫我解決這個問題robertbasic,這是我用來解決我的代碼:

$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

隨着Zend_Measure_Time的幫助下,你可以很容易地得到你想要的任何區別:

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

無需複雜的計算!

1

你可以使用簡單的公式是:

$diffInMonth = ($startYear == $endYear) ? 
       $endMonth - $startMonth + 1 : 
       (($endYear - $startYear) * 12) - $startMonth + $endMonth + 1; 
相關問題