主题BUG修复:明明评论时间未到2年却显示2年

2019-9-5 18:22 来自本站原创 4,907 5 12
[摘要]

主题评论模板的评论时间采用的是时间轴的形式,也就是显示X小时、X天以前,但发现一个问题就是有些评论日期明明还未到2年,却显示了2年前。

主题评论模板的评论时间采用的是时间轴的形式,也就是显示X小时、X天以前,但发现一个问题就是有些评论日期明明还未到2年,却显示了2年前,如下图所示。

主题BUG修复:明明评论时间未到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来满足大多数月份的计算了。

本文最后更新于2019年9月5日,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!

如果认为本文对您有所帮助请赞助本站

支付宝扫一扫赞助微信扫一扫赞助

  • 支付宝扫一扫赞助
  • 微信扫一扫赞助
  • 声明:凡注明“本站原创”的所有文字图片等资料,版权均属 雅兮网 所有,欢迎转载,但务请注明出处;
    目前评论:5   其中:访客  0   博主  0
    加载中...
    1. 5年前 (2019-09-20) 0楼

      厉害了

    2. 5年前 (2019-09-19) 0楼

      我的超过一年就显示日期了,太长觉得没啥意思。

    3. 5年前 (2019-09-07) 0楼

      [强] 发现同样问题 已修改~

    4. 5年前 (2019-09-06) 0楼

      厉害,都能修复代码BUG了!要是我只能坐等主题作者修复了! [抠鼻]

    5. 5年前 (2019-09-06) 0楼

      你这是在强行石更更! [白眼]

    发表评论

    疑问 调皮 难过 抠鼻 吓 微笑 可爱 坏笑 惊讶 发呆 疑问 大兵 偷笑 咒骂 发怒 白眼 鼓掌 得意 擦汗 亲亲 大哭 呲牙 晕 强

    分享 5 12 4,907
    Top