Эквивалент разницы дат в php 5.3 для PHP ‹= 5.2 в собственной функции

Я использую функцию (нашел ее в Интернете), которая вычисляет время, прошедшее до сих пор. Я передаю два параметра: дату публикации и текущую дату. он вернет годы, месяцы, дни, часы, минуты ИЛИ секунды. он использует функцию сравнения дат PHP 5.3, которая не работает в версии 5.2 :(

function pluralize( $zaehler, $inhalt ) { 
return trim($zaehler . ( ( $zaehler == 1 ) ? ( " $inhalt" ) : ( " ${inhalt}s" ) )." ago");}function ago($datetime, $datetime_post){     

$interval = date_create($datetime_post)->diff( date_create($datetime) );

if ( $interval->y >= 1 ) return pluralize( $interval->y, 'year' );
if ( $interval->m >= 1 ) return pluralize( $interval->m, 'month' );
if ( $interval->d >= 1 ) return pluralize( $interval->d, 'day' );
if ( $interval->h >= 1 ) return pluralize( $interval->h, 'hour' );
if ( $interval->i >= 1 ) return pluralize( $interval->i, 'minute' );
if ( $interval->s >= 1 ) return pluralize( $interval->s, 'second' );}

пример:

$post_date_time = "01/01/2012 11:30:22";
$current_date_time = "02/02/2012 07:35:41";

echo ago($current_date_time, $post_date_time);

выведет:

1 month

Теперь мне нужна эквивалентная функция «назад», которая будет делать то же самое, в зависимости от объекта $interval.

Спасибо огромное

Дополнительная информация: ни одно из предоставленных решений не сделало то, что я искал. Я должен улучшить свое объяснение, извините. В конце концов, мне нужно, чтобы объект $interval имел следующее:

object(DateInterval)#3 (8) { ["y"]=> int(0) ["m"]=> int(1) ["d"]=> int(0) ["h"]=> int(20) ["i"]=> int(5) ["s"]=> int(19) ["invert"]=> int(0) ["days"]=> int(6015) }

Нет необходимости менять так много вещей.


person ihazmore    schedule 21.02.2012    source источник
comment
Разве вы не можете использовать stackoverflow.com/questions/676824/?   -  person ale    schedule 21.02.2012
comment
Кроме того, вы можете получить текущую дату и время, используя функцию PHP date( ... ), если вы не знали: php.net/manual/en/function.date.php   -  person ale    schedule 21.02.2012
comment
Очень легко получить разницу двух дат в секундах. Преобразование секунд в часы, минуты и дни тривиально. Преобразование в месяцы и годы... это легко, если предположить, что каждый месяц состоит из 30 дней, а каждый год состоит из 12 месяцев по 30 дней. Является ли это решение приемлемым?   -  person Salman A    schedule 21.02.2012
comment
Вы можете взглянуть на Zend_Date-компонент Zend Framework: framework.zend.com/manual/en/ Чтобы было ясно, вам не нужен полный Zend Framework, возьмите только Zend/Date.php, Zend/Date/ и Zend/ Locale.php (зависимость). Тогда вы сможете использовать new Zend_Date() в своем коде...   -  person dbrumann    schedule 21.02.2012
comment
@vivid-colors: спасибо, к сожалению, нет. результат, который я ожидаю, должен быть только одного типа, например, 2 месяца назад или 34 минуты назад. то же, что твиттер/фб.   -  person ihazmore    schedule 21.02.2012
comment
@Салман/махок. Спасибо. Я не хочу рассчитывать за секунды и потом конвертировать. Я просто хочу настроить свою функцию (не совсем мою) выше, чтобы вы просто вводили две даты, и она возвращалась назад...   -  person ihazmore    schedule 21.02.2012
comment
есть ли способ вернуть объект, подобный следующему? object(DateInterval)#3 (8) { [y]=› int(0) [m]=› int(1) [d]=› int(0) [h]=› int(20) [i]= › int(5) [s]=› int(19) [invert]=› int(0) [days]=› int(6015) }   -  person ihazmore    schedule 22.02.2012
comment
Я только что опубликовал развернутый ответ на повторяющийся вопрос [здесь][1] [1]: stackoverflow.com/questions/4033224/   -  person nembleton    schedule 09.07.2012


Ответы (3)


Мне просто нужно это (к сожалению) для плагина WordPress. Это я использую функцию в 2 раза. Я разместил этот ответ здесь:

  1. В моем классе вызывается ->diff() (мой класс расширяет DateTime, поэтому $this является ссылкой < strong>ДатаВремя )

    function diff ($secondDate){
        $firstDateTimeStamp = $this->format("U");
        $secondDateTimeStamp = $secondDate->format("U");
        $rv = ($secondDateTimeStamp - $firstDateTimeStamp);
        $di = new DateInterval($rv);
        return $di;
    }
    
  2. Затем я воссоздал поддельный класс DateInterval (поскольку DateInterval действителен только в PHP >= 5.3) следующим образом:

    Class DateInterval {
        /* Properties */
        public $y = 0;
        public $m = 0;
        public $d = 0;
        public $h = 0;
        public $i = 0;
        public $s = 0;
    
        /* Methods */
        public function __construct ( $time_to_convert /** in seconds */) {
            $FULL_YEAR = 60*60*24*365.25;
            $FULL_MONTH = 60*60*24*(365.25/12);
            $FULL_DAY = 60*60*24;
            $FULL_HOUR = 60*60;
            $FULL_MINUTE = 60;
            $FULL_SECOND = 1;
    
    //        $time_to_convert = 176559;
            $seconds = 0;
            $minutes = 0;
            $hours = 0;
            $days = 0;
            $months = 0;
            $years = 0;
    
            while($time_to_convert >= $FULL_YEAR) {
                $years ++;
                $time_to_convert = $time_to_convert - $FULL_YEAR;
            }
    
            while($time_to_convert >= $FULL_MONTH) {
                $months ++;
                $time_to_convert = $time_to_convert - $FULL_MONTH;
            }
    
            while($time_to_convert >= $FULL_DAY) {
                $days ++;
                $time_to_convert = $time_to_convert - $FULL_DAY;
            }
    
            while($time_to_convert >= $FULL_HOUR) {
                $hours++;
                $time_to_convert = $time_to_convert - $FULL_HOUR;
            }
    
            while($time_to_convert >= $FULL_MINUTE) {
                $minutes++;
                $time_to_convert = $time_to_convert - $FULL_MINUTE;
            }
    
            $seconds = $time_to_convert; // remaining seconds
            $this->y = $years;
            $this->m = $months;
            $this->d = $days;
            $this->h = $hours;
            $this->i = $minutes;
            $this->s = $seconds;
        }
    }
    

Надеюсь, это поможет кому-то.

person nembleton    schedule 09.07.2012

попробуйте то, что я использую.

function dateDiff($dformat, $endDate, $beginDate)
{
$date_parts1=explode($dformat, $beginDate);
$date_parts2=explode($dformat, $endDate);
$start_date=gregoriantojd($date_parts1[0], $date_parts1[1], $date_parts1[2]);
$end_date=gregoriantojd($date_parts2[0], $date_parts2[1], $date_parts2[2]);
return $end_date - $start_date;
}

$dformat — это разделитель, который вы используете в дате.

person Bert    schedule 21.02.2012
comment
Почему бы вам не использовать strtotime() - php.net/manual/en/function. strtotime.php ? - person Timur; 21.02.2012
comment
для меня gregoriantojd лучше, потому что мне не нужно беспокоиться о формате даты, поскольку он принимает части даты в качестве параметра, а функция возвращается через несколько дней. но также может использовать strtotime(); - person Bert; 21.02.2012

Есть простой способ. Вы можете изменить некоторые вещи там, чтобы они соответствовали вашим потребностям.

<?php //preparing values
date_default_timezone_set('Europe/Berlin');

$startDate = '2011-01-21 09:00:00';
$endDate = date('Y-m-d H:i:s');

// time span seconds
$sec = explode(':', (gmdate('Y:m:d:H:i:s', strtotime($endDate) - strtotime($startDate))));

// getting all the data into array
$data = array();
list($data['years'], $data['months'], $data['days'], $data['hours'], $data['minutes'], $data['seconds']) = $sec;
$data['years'] -= 1970;

var_dump($data);

?>
person wormhit    schedule 21.02.2012