Unix отметка времени в днях, часах, минутах - PullRequest
2 голосов
/ 27 июня 2009

Итак, в моей таблице пользователей есть поле с именем last_active, которое обновляется каждый раз, когда пользователь перезагружает страницу.
Оно хранится в метке времени Unix.

Я хотел бы вывести это так: Last online: 4 d 18 h 19 m ago

Как можно это сделать? Можете ли вы сделать это с датой PHP ()?

Спасибо.

Ответы [ 5 ]

4 голосов
/ 27 июня 2009

Вы можете достичь этого непосредственно в MySQL, если хотите:

select date_format(from_unixtime(current_timestamp - last_timestamp), 
    'Last online: %e days, %k hours, %i minutes, %s seconds ago.');

(current_timestamp можно заменить на unix_timestamp(now()), если вы хотите, чтобы он был рассчитан на месте)

DATE_FORMAT позволяет вам иметь пользовательскую строку на основе определенной даты. Если вы укажете дату с разницей между двумя временными метками, она будет работать так, как вы просили.

Приведенное выше решение будет работать, только если оно меньше месяца; если вы хотите дни года, используйте% j. Документация для функции показывает больше.

3 голосов
/ 27 июня 2009

Самый простой подход к этому - взять отметку времени last_active и текущую отметку времени с time(). Затем вычтите последний активный из текущей отметки времени, а затем просто разделите результат на количество секунд в дне, чтобы получить разницу в днях, количество секунд в часе, чтобы получить разницу в часах и т. Д.

Этот подход может быть немного неточным в некоторых особых случаях (високосные годы и т. Д.), Но его должно быть достаточно для более простого варианта использования

1 голос
/ 15 октября 2012

Найдя десятки неработающих или наполовину готовых решений, я построил следующую функцию для отметок времени UNIX.
Вы можете ограничить уровень детализации ...

echo timeDiff(1350297908); покажет «5 минут 42 секунды назад».
echo timeDiff(1350297908, 1); просто покажет "5 минут назад".

function timeDiff( $from, $levels=7 ){  
    $now = time();
    $diff = ($from > $now) ? $from - $now : $now - $from;
    $status = ($from > $now) ? ' away' : ' ago';
    $times = array(31536000, 2628000, 604800, 86400, 3600, 60, 1);
    $words = array('year', 'month', 'week', 'day', 'hour', 'minute', 'second');
    $str = array();
    foreach ($times as $k=>$v){
        $val = floor($diff/$v);
        if ($val) {
            $str[] = $val .' '. $words[$k] . ($val==1 ? '' : 's');
            $levels--;
        }
        $diff %= $v;
        if ($levels==0) break;
    }
    return implode(', ', $str) . $status;
}
1 голос
/ 05 июля 2009

Проверьте эту статью, это именно то, что вам нужно

http://blog.fedecarg.com/2009/06/25/format-a-time-interval-with-the-requested-granularity/

0 голосов
/ 15 сентября 2011

Я написал эту простую функцию, когда мне нужно такое решение (в качестве входных данных используются минуты):

function minutes_to_time($minutes)
{
    $obj = "";

    // extract days
    $days = floor($minutes/(1440)); # Divide on the daily minutes 60 min * 24 hours
    # echo "Days: " . $days;

    // extract hours
    $hours = floor(($minutes-($days*1440))/60);
    # echo " Hours: " . $hours;

    // extract left minutes
    $minutes = ($minutes-($days*24*60)-($hours*60));
    # echo " Minutes: " . $minutes;

    if ($days > 0)
    {
        $obj .= $days . "d ";
    }
    if ($hours > 0)
    {
        $obj .= $hours . "h ";
    }
    if ($minutes >= 0)
    {
        $obj .= $minutes . "m ";
    }

    $obj .= "ago";

    return $obj;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...