2012-02-21 2 views
0

Я использую функцию (найденную в Интернете), которая вычисляет время, прошедшее до сих пор. Я передаю два параметра: дата публикации и текущая дата. он будет возвращать годы, месяцы, дни, часы, минуты или секунды. он использует PHP 5.3 в функцию даты различия, который не будет делать в версии 5.2 :(php 5.3 date diff эквивалентен PHP <= 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 

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

большое вам спасибо

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

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) } 

не нужно менять так много вещей.

+0

Не можете ли вы использовать http://stackoverflow.com/questions/676824/how-to-calculate-the-difference-between-two-dates-using-php? – ale

+0

Кроме того, вы можете получить текущую дату с помощью функции 'date (...)' PHP, если вы этого не знали: http://php.net/manual/en/function.date.php – ale

+0

Это очень легко получить разницу между двумя датами, в секундах. Преобразование секунд в часы, минуты и дни тривиально. Преобразование в месяцы и годы ... это легко, если вы считаете, что каждый месяц составляет 30 дней и каждый год имеет 12 30-дневных месяцев. Является ли это решение приемлемым? –

ответ

0

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

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 - это разделитель, используемый вами в дате.

+0

Почему вы не используете strtotime() - http://php.net/manual/en/function.strtotime.php? – Timur

+0

для меня gregoriantojd лучше bcoz. Мне не нужно беспокоиться о формате даты, так как он принимает дату в качестве параметра, а функция возвращает в днях. но также может использовать strtotime(); – Bert

0

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

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

?> 
+0

спасибо, червь, выглядит красиво. попробуем и дадим вам знать. – ihazmore

1

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

  1. В моем классе вызывающего -> Diff() (мой класс расширяет DateTime, так $ этой является эталонным DateTime)

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

Надежда, что помогает кому-то.