因此,我的用户表中有一个名为last_active
的字段,每次用户重新加载页面时都会更新。
它存储在unix时间戳中。
我想像这样输出:Last online: 4 d 18 h 19 m ago
如何做到这一点?你能用php的date()吗?
谢谢。
答案 0 :(得分:4)
如果您愿意,可以直接在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。该功能的文档显示更多。
答案 1 :(得分:3)
最简单的方法是使用last_active
时间戳和当前时间戳time()
。然后从当前时间戳中减去最后一个活动,然后简单地将结果除以一天中的秒数以获得天数差异,以小时为单位的秒数以获得小时差异等等。
在某些特殊情况下(闰年等),这种方法可能稍微不准确,但它应该足以让您使用更简单的用例
答案 2 :(得分:1)
查看这篇文章,它正是您所需要的
http://blog.fedecarg.com/2009/06/25/format-a-time-interval-with-the-requested-granularity/
答案 3 :(得分:1)
在找到几十个破解或半解决方案之后,我为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;
}
答案 4 :(得分:0)
当我需要这种解决方案时,我写了这个简单的函数(输入时间为几分钟):
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;
}