Php 如何计算两个Zend_日期对象之间的差值(以月为单位)

Php 如何计算两个Zend_日期对象之间的差值(以月为单位),php,zend-framework,Php,Zend Framework,我有两个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 如果我正确阅读了文档,就没有实现以秒/分钟/月/年为单位的两

我有两个
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

如果我正确阅读了文档,就没有实现以秒/分钟/月/年为单位的两个日期之间的差异的功能。所以你需要自己计算。这样做就可以了(我不知道是否需要考虑闰年、DST等):


对于希望获得友好输出(天、小时、分钟、秒)的任何人,我在这里分享我的代码:

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

我过去常常通过计算两个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;
    }

谢谢,您的回答帮助我解决了问题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 );

借助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();

不需要复杂的计算

您可以使用简单的公式得到:

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

我怀疑,由于返回值可能是Zend_日期,
$months
var永远不会超过12。。。(或11,如果它是基于0的)好吧,这个例子的最终结果是25。。。最后,由您决定最佳答案=)如果没有“复杂”计算(一个为此设计的函数),您将无法获得比这更好的结果。这将无法正确处理夏令时。最好转换成朱利安日期,做一个简单的减法。
$diffInMonth = ($startYear == $endYear) ? 
               $endMonth - $startMonth + 1 : 
               (($endYear - $startYear) * 12) - $startMonth + $endMonth + 1;