Рассчитайте разницу во времени между двумя датами и представите ответ типа «2 дня 3 часа назад»

Существуют ли какие-либо классы / функции, написанные на php, общедоступные, которые будут использовать временную метку и возвращать время, прошедшее с тех пор в число дней, месяцев, лет и т. Д.? В принципе, я хочу, чтобы одна и та же функция генерировала время, опубликованное вместе с каждой записью на этом сайте (и на digg и на других сайтах).

Это написано как плагин wordpress, но вы можете извлечь соответствующий код PHP без проблем: нечеткая дата-время

Вот Zend Framework ViewHelper, который я написал для этого, вы можете легко изменить это, чтобы не использовать специальный код ZF:

/** * @category View_Helper * @package Custom_View_Helper * @author Chris Jones <leeked@gmail.com> * @license New BSD License */ class Custom_View_Helper_HumaneDate extends Zend_View_Helper_Abstract { /** * Various time formats */ private static $_time_formats = array( array(60, 'just now'), array(90, '1 minute'), // 60*1.5 array(3600, 'minutes', 60), // 60*60, 60 array(5400, '1 hour'), // 60*60*1.5 array(86400, 'hours', 3600), // 60*60*24, 60*60 array(129600, '1 day'), // 60*60*24*1.5 array(604800, 'days', 86400), // 60*60*24*7, 60*60*24 array(907200, '1 week'), // 60*60*24*7*1.5 array(2628000, 'weeks', 604800), // 60*60*24*(365/12), 60*60*24*7 array(3942000, '1 month'), // 60*60*24*(365/12)*1.5 array(31536000, 'months', 2628000), // 60*60*24*365, 60*60*24*(365/12) array(47304000, '1 year'), // 60*60*24*365*1.5 array(3153600000, 'years', 31536000), // 60*60*24*365*100, 60*60*24*365 ); /** * Convert date into a pretty 'human' form * Now with microformats! * * @param string|Zend_Date $date_from Date to convert * @return string */ public function humaneDate($date_from) { $date_to = new Zend_Date(null, Zend_Date::ISO_8601); if (!($date_from instanceof Zend_Date)) { $date_from = new Zend_Date($date_from, Zend_Date::ISO_8601); } $dateTo = $date_to->getTimestamp(); // UnixTimestamp $dateFrom = $date_from->getTimestamp(); // UnixTimestamp $difference = $dateTo - $dateFrom; $message = ''; if ($dateFrom <= 0) { $message = 'a long time ago'; } else { foreach (self::$_time_formats as $format) { if ($difference < $format[0]) { if (count($format) == 2) { $message = $format[1] . ($format[0] === 60 ? '' : ' ago'); break; } else { $message = ceil($difference / $format[2]) . ' ' . $format[1] . ' ago'; break; } } } } return sprintf('<abbr title="%sZ">%s</abbr>', $date_from->get('YYYY-MM-ddTHH:mm:ss'), $message ); } } 

Не могли бы вы просто перевести код C #, который использует SO ?

Я не уверен, что для этого будут занятия, но я нашел в Google несколько методов для достижения того, чего вы хотите:

Возможно, один из них подходит или нуждается, или вы можете легко его адаптировать.

Брат Google знает ответ:

Это было задано раньше:

Как рассчитать разницу между двумя датами с помощью PHP?

Это лучшая версия, которую я видел (для удобного для чтения формата):

http://www.if-not-true-then-false.com/2010/php-calculate-real-differences-between-two-dates-or-timestamps/

В PHP 5+ есть что-то, что теперь встроено:

http://php.net/manual/en/datetime.diff.php

Я лично искал вычисление количества дней (как десятичного), чтобы потом подмножество в годы и т. Д.

 function daysDifference($d1,$d2) { $ts2 = strtotime($d1); $ts1 = strtotime($d2); $seconds = abs($ts2 - $ts1); # difference will always be positive $days = $seconds/60/60/24; return $days; } 

Эта функция возвращает числовой массив. Вы можете извлекать годы, месяцы, дни, часы, минуты и секунды. например, echo $ result [3] получает часы и echo $ result [4] получает минуты. (Я взял этот код). ура!

 function dateDiff($time1, $time2, $precision = 6) { // If not numeric then convert texts to unix timestamps if (!is_int($time1)) { $time1 = strtotime($time1); } if (!is_int($time2)) { $time2 = strtotime($time2); } // If time1 is bigger than time2 // Then swap time1 and time2 if ($time1 > $time2) { $ttime = $time1; $time1 = $time2; $time2 = $ttime; } // Set up intervals and diffs arrays $intervals = array('year', 'month', 'day', 'hour', 'minute', 'second'); $diffs = array(); // Loop thru all intervals foreach ($intervals as $interval) { // Set default diff to 0 $diffs[$interval] = 0; // Create temp time from time1 and interval $ttime = strtotime("+1 " . $interval, $time1); // Loop until temp time is smaller than time2 while ($time2 >= $ttime) { $time1 = $ttime; $diffs[$interval]++; // Create new temp time from time1 and interval $ttime = strtotime("+1 " . $interval, $time1); } } $count = 0; $times = array(); // Loop thru all diffs foreach ($diffs as $interval => $value) { // Break if we have needed precission if ($count >= $precision) { break; } // Add value and interval // if value is bigger than 0 if ($value >= 0) { // Add s if value is not 1 if ($value != 1) { $interval .= "s"; } // Add value and interval to times array $times[] = $value; // . " " . $interval; $count++; } } // Return string with times //return implode(", ", $times); return $times; }