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

PHP使用date_diff生成发布时长仅显示分钟的问题求助

解决PHP相对时间显示仅生效分钟的问题

嘿,我帮你找出问题所在啦!你想要实现包含Just Now、1 Minutes Ago这类的相对时间显示,但当前代码只生效分钟单位,其他时长都没反应,问题主要出在两个地方:

先看看你的问题场景

你使用的时间格式是 2018-05-11 07:38:47,原始代码如下:

$datetime1 = date_create($value['date']); 
$datetime2 = date_create("now"); 
$diff=date_diff($datetime1,$datetime2); 
if($diff->i >0){ 
    $final_date = $diff->format("%I Minutes Ago"); 
}else if($diff->h >0){ 
    $final_date = $diff->format("%H Hours Ago"); 
}else if($diff->y >0){ 
    $final_date = $diff->format("%Y Years Ago"); 
}else if($diff->m >0){ 
    $final_date = $diff->format("%M Months Ago"); 
}else if($diff->d >0){ 
    $final_date = $diff->format("%D Days Ago"); 
} else { 
    $final_date = "Just Now"; 
}

问题原因分析

  1. 判断顺序完全搞反了:你先检查了分钟数$diff->i >0,但只要时间差存在哪怕1分钟(哪怕已经过了几小时、几天甚至几年),这个条件都会优先触发,后面的小时、天等判断根本没机会执行!正确的顺序应该是从最大的时间单位往最小的查,比如先看年,再月、天、小时,最后才是分钟。
  2. 格式符用错了:%D是用来显示星期缩写的(比如Mon、Tue),不是天数,要显示天数得用%d;另外你需要给数字加<strong>标签,原始代码里也没处理这一点。

修正后的代码

$datetime1 = date_create($value['date']); 
$datetime2 = date_create("now"); 
$diff = date_diff($datetime1, $datetime2); 

// 从大到小判断时间单位
if($diff->y > 0){ 
    $final_date = "<strong>{$diff->y}</strong> Years Ago"; 
}else if($diff->m > 0){ 
    $final_date = "<strong>{$diff->m}</strong> Months Ago"; 
}else if($diff->d > 0){ 
    $final_date = "<strong>{$diff->d}</strong> Days Ago"; 
}else if($diff->h > 0){ 
    $final_date = "<strong>{$diff->h}</strong> Hours Ago"; 
}else if($diff->i > 0){ 
    $final_date = "<strong>{$diff->i}</strong> Minutes Ago"; 
}else { 
    $final_date = "Just Now"; 
}

额外优化建议

如果想要更严谨的单数复数显示(比如1 Minute Ago而不是1 Minutes Ago),可以给每个单位加个简单的判断:

// 以分钟为例
$minuteLabel = $diff->i == 1 ? "Minute" : "Minutes";
$final_date = "<strong>{$diff->i}</strong> {$minuteLabel} Ago";

其他时间单位(小时、天、月、年)都可以用同样的方式处理~

内容的提问来源于stack exchange,提问作者Jazuly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 08:53:02