Временная метка Unix для дней, часов, минут

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

Я хотел бы вывести его следующим образом: Last online: 4 d 18 h 19 m ago

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

Спасибо.

Вы можете достичь этого непосредственно в 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. Документация для функции показывает больше.

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

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

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

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

Найдя десятки сломанных или половинных решений, я построил следующую функцию для временных меток 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; } 

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

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