主题评论模板的评论时间采用的是时间轴的形式,也就是显示X小时、X天以前,但发现一个问题就是有些评论日期明明还未到2年,却显示了2年前。
主题评论模板的评论时间采用的是时间轴的形式,也就是显示X小时、X天以前,但发现一个问题就是有些评论日期明明还未到2年,却显示了2年前,如下图所示。
于是排查源码,
function timeago( $ptime ) { $ptime = strtotime($ptime); $etime = time() - $ptime; if ($etime < 1) return '刚刚'; $interval = array ( 12 * 30 * 24 * 60 * 60 => '年前 ('.date('Y-m-d', $ptime).')', 30 * 24 * 60 * 60 => '个月前 ('.date('m-d', $ptime).')', 7 * 24 * 60 * 60 => '周前 ('.date('m-d', $ptime).')', 24 * 60 * 60 => '天前', 60 * 60 => '小时前', 60 => '分钟前', 1 => '秒前' ); foreach ($interval as $secs => $str) { $d = $etime / $secs; if ($d >= 1) { $r = round($d); return $r . $str; } }; }
可以看到源码的逻辑是判断当前时间戳和评论时间戳的差值。然后通过函数计算取整来显示具体的数值和单位。
1、<1秒显示刚刚
2、>1秒且<60秒 显示X秒前
3、>60秒且<60*60秒 显示X分钟前
...
这时,发现一个函数$r = round($d);
这是四舍五入取整的方法,这就是原因所在了,比如上图中明明日期还不到两年,却显示了两年,是因为日期差值实际是1.991年,虽然没到2年,却被四舍五入到两年。
所以如果更友好的显示时间轴,最好还是直接去除小数,只要整数部分,于是将$r = round($d);
改为 $r = intval($d);
则显示了较为友好的时间轴,显示为1年前。
但此时还有一个问题,虽然周、天、时、分、秒是精准的,但就每个月的天数却不固定子在30天,一年也不止12*30=360天,这就导致可能明明评论日期还没到31天就显示一个月了。
所以要将年数判断里将30*12 直接改为365,虽然无法兼顾闰年,但也差强人意了;月份亦是如此,只能写30来满足大多数月份的计算了。
厉害了
我的超过一年就显示日期了,太长觉得没啥意思。
发现同样问题 已修改~
厉害,都能修复代码BUG了!要是我只能坐等主题作者修复了!
你这是在强行石更更!