You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何显示相对时间差?当前代码时间显示错误且所有数据时间一致

问题分析与解决方案

看起来你遇到了两个头疼的问题:一是所有评论的相对时间显示完全相同,二是时间格式只会显示“分钟前”,没法根据实际间隔显示“X天前”“X小时前”这类更合理的内容。我来帮你一步步搞定:

一、为什么所有时间都显示一样?

先揪出几个可能的元凶:

  1. samay字段格式/值异常:
    如果$row->samay的格式不是strtotime()能识别的标准格式(比如不是Y-m-d H:i:s),或者字段值是null,strtotime($tim)会返回false(也就是0)。这样所有计算的起始时间戳都是0,最终时间差自然全是当前时间减0,显示结果肯定一模一样。
    你可以在循环里临时加一行var_dump($tim);,看看这个字段的实际值是什么,排查数据源问题。

  2. PDO异常捕获拼写错误:
    你的代码里写的是catch(PDOEception $e),正确的类名是PDOException(少了一个x)!这会导致PDO的错误无法被捕获,如果数据库查询出问题,你根本看不到错误提示,这也可能间接导致时间显示异常。

  3. 不必要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:23:55