Большинство ответов, похоже, сосредоточены на преобразовании даты из строки во время. Похоже, вы в основном думаете о преобразовании даты в формат "5 дней назад" и т.д., верно?
Вот как бы я это сделал:
$time = strtotime('2010-04-28 17:25:43');
echo 'event happened '.humanTiming($time).' ago';
function humanTiming ($time)
{
$time = time() - $time; // to get the time since that moment
$time = ($time<1)? 1 : $time;
$tokens = array (
31536000 => 'year',
2592000 => 'month',
604800 => 'week',
86400 => 'day',
3600 => 'hour',
60 => 'minute',
1 => 'second'
);
foreach ($tokens as $unit => $text) {
if ($time < $unit) continue;
$numberOfUnits = floor($time / $unit);
return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':'');
}
}
Я не тестировал это, но это должно работать.
Результат будет выглядеть так
event happened 4 days ago
или
event happened 1 minute ago
ура
Преобразовать [сохраненная_дата] в метку времени. Получить текущую отметку времени.
текущая отметка времени - отметка времени [сохраненная_дата].
Затем вы можете отформатировать его с помощью date ();
Обычно вы можете преобразовать большинство форматов даты в метки времени с помощью функции strtotime ().
Думаю, у меня есть функция, которая должна делать то, что вы хотите:
function time2string($timeline) {
$periods = array('day' => 86400, 'hour' => 3600, 'minute' => 60, 'second' => 1);
foreach($periods AS $name => $seconds){
$num = floor($timeline / $seconds);
$timeline -= ($num * $seconds);
$ret .= $num.' '.$name.(($num > 1) ? 's' : '').' ';
}
return trim($ret);
}
Просто примените ее к разнице между time ()
и strtotime ('2010 -04-28 17:25:43 ')
так:
print time2string(time()-strtotime('2010-04-28 17:25:43')).' ago';
Для определения прошедшего времени я обычно использую time()
вместо date()
и форматированные метки времени.
Затем получите разницу между последним и предыдущим значением и отформатируйте соответствующим образом. time()
, конечно, не заменяет date()
, но очень помогает при вычислении прошедшего времени.
пример:
Значение time()
выглядит примерно так 1274467343
увеличивается каждую секунду. Поэтому вы можете иметь $erlierTime
со значением 1274467343
и $latterTime
со значением 1274467500
, затем просто сделайте $latterTime - $erlierTime
, чтобы получить время, прошедшее в секундах.
Один из вариантов, который будет работать с любой версией PHP - сделать то, что уже было предложено, то есть что-то вроде этого:
$eventTime = '2010-04-28 17:25:43';
$age = time() - strtotime($eventTime);
Это даст вам возраст в секундах. После этого вы можете отобразить его, как пожелаете.
Одна проблема с этим подходом, однако, заключается в том, что он не учитывает сдвиг времени, вызванный DST. Если это не вызывает беспокойства, то соглашайтесь. В противном случае вы, вероятно, захотите использовать метод diff() в классе DateTime. К сожалению, это возможно только в том случае, если вы используете PHP не ниже версии 5.3.
Написал свой
function getElapsedTime($eventTime)
{
$totaldelay = time() - strtotime($eventTime);
if($totaldelay <= 0)
{
return '';
}
else
{
if($days=floor($totaldelay/86400))
{
$totaldelay = $totaldelay % 86400;
return $days.' days ago.';
}
if($hours=floor($totaldelay/3600))
{
$totaldelay = $totaldelay % 3600;
return $hours.' hours ago.';
}
if($minutes=floor($totaldelay/60))
{
$totaldelay = $totaldelay % 60;
return $minutes.' minutes ago.';
}
if($seconds=floor($totaldelay/1))
{
$totaldelay = $totaldelay % 1;
return $seconds.' seconds ago.';
}
}
}