项目中的留言板和论坛的帖子都需要显示时间,时间的显示希望做成显示如:“几分钟前、几小时前、几天前”的样式,简单的代码如下:
function time_ago($agoTime)
{
$agoTime = (int)$agoTime;
// 计算出当前日期时间到之前的日期时间的毫秒数,以便进行下一步的计算
$time = time() - $agoTime;
if ($time >= 31104000) { // N年前
$num = (int)($time / 31104000);
return $num.'年前';
}
if ($time >= 2592000) { // N月前
$num = (int)($time / 2592000);
return $num.'月前';
}
if ($time >= 86400) { // N天前
$num = (int)($time / 86400);
return $num.'天前';
}
if ($time >= 3600) { // N小时前
$num = (int)($time / 3600);
return $num.'小时前';
}
if ($time > 60) { // N分钟前
$num = (int)($time / 60);
return $num.'分钟前';
}
return '1分钟前';
}
这段代码来自网上,本来就难度不大,懒得自己写了。我这里修改一下,放在模型的获取器中。
表中的时间字段是addtime,存储类型为int
public function getAddtimeAttr($value, $data)
{
$addtime = $data['addtime'];
$time = time() - $addtime; //获取帖子发布时间与当前时间的差值
if ($time >= 604800) { // 7天前的时间显示实际时间
return date('Y-m-d H:i:s', $addtime);
}
if ($time >= 86400) { // N天前
$num = (int)($time / 86400);
return $num.'天前';
}
if ($time >= 3600) { // N小时前
$num = (int)($time / 3600);
return $num.'小时前';
}
if ($time > 60) { // N分钟前
$num = (int)($time / 60);
return $num.'分钟前';
}
return '1分钟前';
}
这样在控制器中直接调用就行了
最近我使用一种改进的代码,这样能更加精确的显示:
public function getCreatetimeAttr($value, $data)
{
$addtime = $data['createtime'];
$time = time() - $addtime; //获取帖子发布时间与当前时间的差值
$f = array(
'31536000' => '年',
'2592000' => '个月',
'604800' => '星期',
'86400' => '天',
'3600' => '小时',
'60' => '分钟',
'1' => '秒'
);
foreach ($f as $k => $v) {
if (0 != $c = floor($time / (int)$k)) {
return $c . $v . '前';
}
}
}
Comments