[英]Unix timestamp to days, hours, minutes
因此,我的用户表中有一个名为last_active
的字段,每次用户重新加载页面时都会更新。
它存储在unix时间戳中。
我想这样输出: Last online: 4 d 18 h 19 m ago
如何做到这一点? 你能用php的date()来做吗?
谢谢。
如果您愿意,可以直接在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()
获取当前时间戳。 然后从当前时间戳中减去最后一个活动,然后简单地将结果除以一天中的秒数以获得天数差异,以小时为单位的秒数以获得小时差异等等。
在某些特殊情况下(闰年等),这种方法可能稍微不准确,但它应该足够您的简单用例
在找到几十个破解或半解决方案之后,我为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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.