как рассчитать разницу между двумя объектами Zend_Date, по месяцам - PullRequest
6 голосов
/ 13 июня 2010

У меня есть два объекта класса 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

Заранее спасибо!

Ответы [ 6 ]

16 голосов
/ 21 июня 2012

С помощью 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();

Нет необходимости в сложных вычислениях!

13 голосов
/ 13 июня 2010

Если я правильно прочитал документы, то нет реализованной функциональности для получения разницы между двумя датами в секундах / минутах /.../ месяцах / годах, поэтому вам нужно будет рассчитать ее самостоятельно. Что-то вроде этого подойдет (не знаю, если это займет високосные годы, летнее время и тому подобное):

<?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);
1 голос
/ 30 декабря 2013

Вы можете получить его по простой формуле:

$diffInMonth = ($startYear == $endYear) ? 
               $endMonth - $startMonth + 1 : 
               (($endYear - $startYear) * 12) - $startMonth + $endMonth + 1;
1 голос
/ 20 июня 2011

Спасибо, ваш ответ помог мне решить проблему 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 );
1 голос
/ 23 марта 2011

Для тех, кто хочет получить дружественный вывод (дни, часы, минуты, секунды), я делюсь своим кодом здесь:

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 голосов
/ 25 марта 2011

Раньше я делал это, принимая разницу между двумя датами Зенд, но это очень сложно, как справедливо замечает Эльзо Валуги выше. Лучше использовать человеческий подход. Ваш возраст в годах - это разница между годовой частью обеих дат, если день вашего рождения уже был, если нет, на один год меньше. Нечто подобное можно сделать с месяцами.

    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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...