2010-06-13 38 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; 
相关问题