PHP中如何显示相对时间差?当前代码时间显示错误且所有数据时间一致
看起来你遇到了两个头疼的问题:一是所有评论的相对时间显示完全相同,二是时间格式只会显示“分钟前”,没法根据实际间隔显示“X天前”“X小时前”这类更合理的内容。我来帮你一步步搞定:
一、为什么所有时间都显示一样?
先揪出几个可能的元凶:
samay字段格式/值异常:
如果$row->samay的格式不是strtotime()能识别的标准格式(比如不是Y-m-d H:i:s),或者字段值是null,strtotime($tim)会返回false(也就是0)。这样所有计算的起始时间戳都是0,最终时间差自然全是当前时间减0,显示结果肯定一模一样。
你可以在循环里临时加一行var_dump($tim);,看看这个字段的实际值是什么,排查数据源问题。PDO异常捕获拼写错误:
你的代码里写的是catch(PDOEception $e),正确的类名是PDOException(少了一个x)!这会导致PDO的错误无法被捕获,如果数据库查询出问题,你根本看不到错误提示,这也可能间接导致时间显示异常。不必要的UPDATE语句:
开头的UPDATE comments SET status=1 WHERE status=0会在每次页面加载时把所有未处理的评论标记为已处理,这大概率不是你想要的逻辑,如果不需要这个操作,建议直接移除,避免误操作数据。
二、如何实现正确的相对时间显示?
我们可以写一个专门的函数来处理不同跨度的时间差,替换你现在硬编码的分钟计算逻辑:
修正后的完整代码
<?php // 移除不必要的UPDATE语句(如果不需要每次都标记所有未处理评论) // $conn = new mysqli("localhost","root","","blog_samples"); // $sql="UPDATE comments SET status=1 WHERE status=0"; // $result=mysqli_query($conn, $sql); // 相对时间计算函数 function getRelativeTime($timestamp) { $now = time(); $diff = $now - $timestamp; if ($diff < 60) { return "刚刚"; } elseif ($diff < 3600) { // 小于1小时 $minutes = floor($diff / 60); return $minutes . "分钟前"; } elseif ($diff < 86400) { // 小于1天 $hours = floor($diff / 3600); return $hours . "小时前"; } elseif ($diff < 2592000) { // 小于30天 $days = floor($diff / 86400); return $days . "天前"; } else { // 超过30天显示原始日期 return date('Y-m-d H:i', $timestamp); } } try{ $con = new PDO("mysql:host=localhost;dbname=blog_samples",'root',''); $sth = $con->prepare("SELECT * FROM `comments` ORDER BY id DESC limit 5"); $sth->setFetchMode(PDO::FETCH_OBJ); $sth->execute(); while($row=$sth->fetch()){ // 先确保$row->samay能被正确解析为时间戳 $tim = $row->samay; $timestamp = strtotime($tim); // 如果解析失败,显示默认提示 $relativeTime = $timestamp ? getRelativeTime($timestamp) : "未知时间"; ?> <li> <a href="javascript:void(0)"> <span class="label label-primary"><i class="fa fa-user"></i></span> <span class="message"> New POST</span> <span class="time"><?php echo $relativeTime; ?></span> </a> </li> <?php } } catch(PDOException $e){ // 修正拼写错误 echo "Error: ". $e->getMessage(); } ?>
关键改进点:
- 新增了
getRelativeTime函数,根据时间差自动切换显示“刚刚”“分钟前”“小时前”“天前”,超过30天则显示具体日期,更符合用户阅读习惯。 - 增加了时间戳解析失败的容错处理,避免显示错误的时间。
- 修正了PDO异常类的拼写错误,确保能捕获数据库错误,方便排查问题。
- 注释掉了可能不需要的UPDATE语句,避免误操作数据。
额外排查建议
如果还是显示相同时间,先确认comments表中samay字段的每条记录值是否不同,以及字段类型是否为DATETIME或TIMESTAMP(推荐用这两种类型,存储格式标准,strtotime能完美解析)。
内容的提问来源于stack exchange,提问作者Archi Patel

