PHP, Как найти время, протек со времени даты? [дубликат]

90
задан Basil Bourque 19 September 2015 в 17:30
поделиться

6 ответов

Большинство ответов, похоже, сосредоточены на преобразовании даты из строки во время. Похоже, вы в основном думаете о преобразовании даты в формат "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

ура

228
ответ дан 24 November 2019 в 06:56
поделиться

Преобразовать [сохраненная_дата] в метку времени. Получить текущую отметку времени.

текущая отметка времени - отметка времени [сохраненная_дата].

Затем вы можете отформатировать его с помощью date ();

Обычно вы можете преобразовать большинство форматов даты в метки времени с помощью функции strtotime ().

1
ответ дан 24 November 2019 в 06:56
поделиться

Думаю, у меня есть функция, которая должна делать то, что вы хотите:

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';
8
ответ дан 24 November 2019 в 06:56
поделиться

Для определения прошедшего времени я обычно использую time() вместо date() и форматированные метки времени. Затем получите разницу между последним и предыдущим значением и отформатируйте соответствующим образом. time(), конечно, не заменяет date(), но очень помогает при вычислении прошедшего времени.

пример:

Значение time() выглядит примерно так 1274467343 увеличивается каждую секунду. Поэтому вы можете иметь $erlierTime со значением 1274467343 и $latterTime со значением 1274467500, затем просто сделайте $latterTime - $erlierTime, чтобы получить время, прошедшее в секундах.

0
ответ дан 24 November 2019 в 06:56
поделиться

Один из вариантов, который будет работать с любой версией PHP - сделать то, что уже было предложено, то есть что-то вроде этого:

$eventTime = '2010-04-28 17:25:43';
$age = time() - strtotime($eventTime);

Это даст вам возраст в секундах. После этого вы можете отобразить его, как пожелаете.

Одна проблема с этим подходом, однако, заключается в том, что он не учитывает сдвиг времени, вызванный DST. Если это не вызывает беспокойства, то соглашайтесь. В противном случае вы, вероятно, захотите использовать метод diff() в классе DateTime. К сожалению, это возможно только в том случае, если вы используете PHP не ниже версии 5.3.

1
ответ дан 24 November 2019 в 06:56
поделиться

Написал свой

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.';
        }
    }
}
0
ответ дан 24 November 2019 в 06:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: