php 8 中格式化相对时间最稳妥的方式是使用 carbon 库的 diffforhumans() 方法并设置中文本地化,而非手写逻辑或依赖 date/gmdate;手动实现需用 datetime::createfromformat 解析时间并按天数差分段处理,避免 strtotime 和硬编码秒数。

PHP 8 中格式化相对时间(如“3分钟前”“昨天”)最稳妥的方式是用 Carbon,而不是手写时间戳差值逻辑——后者容易在边界、时区、夏令时和跨月计算上出错。
用 Carbon::diffForHumans() 直接输出中文相对时间
这是当前 PHP 8 项目中最推荐的做法,尤其在 Laravel 或已引入 Composer 依赖的环境中:
- 先确保已安装:
composer require nesbot/carbon - 代码中引入并设置中文:
use Carbon\Carbon; Carbon::setLocale('zh'); - 解析任意时间字符串或时间戳后调用:
$date = Carbon::parse('2026-09-16 14:20:00'); echo $date->diffForHumans(); // 输出:昨天 - 注意:
diffForHumans()默认基于当前系统时间(now()),且自动处理“刚刚”“几秒前”“几分钟前”“几小时前”“昨天”“一周前”“一个月前”等分级逻辑,无需手动 if-else
不用第三方库时,手写函数必须避开 strtotime() 的坑
如果项目不允许引入 Carbon,需手写函数,但绝不能直接用 strtotime($_POST['time']) 或 date('Y-m-d', '2026-09-16') 这类写法——它们在 PHP 8 下更易静默失败或时区错乱:
- 输入时间必须是有效时间戳(
int),不是字符串。若来源是数据库字段或用户输入,优先用DateTime::createFromFormat()解析,例如:$dt = DateTime::createFromFormat('Y-m-d H:i:s', $input); $timestamp = $dt ? $dt->getTimestamp() : false; - 计算差值时,用
time() - $targetTimestamp,但要检查是否为负数(未来时间),否则diffForHumans()类行为会失效 - 判断区间时别硬编码 30 天 ≈ 2592000 秒——月份天数不固定。建议按“天数差”判断更可靠:
$days = floor(($now - $target) / 86400);
再分段处理:1 天 → “昨天”,2–6 天 → “X天前”,7–30 天 → “1周前”等
gmdate() 和 date() 都不适合做相对时间
gmdate() 和 date() 只负责「绝对时间格式化」,比如把时间戳转成 "2026-09-16 14:20:00",它们不提供任何“X分钟前”逻辑,强行套用只会写出一堆脆弱的 if-else:
-
date()受date_default_timezone_set()控制,未设时区时行为不可控;线上环境常与本地不一致 -
gmdate()强制输出 UTC 时间,但相对时间语义(如“刚才”)必须基于用户/系统本地感知时间,不是 GMT - PHP 8.1+ 已弃用
gmstrftime()和strftime(),且它们严重依赖系统 locale,中文支持不稳定
真正难的不是算差值,而是让“1个月前”在 3 月 31 日减去 1 个月时正确回退到 2 月 28 日,而不是崩成 3 月 0 日——这种细节 Carbon 内置了完整处理,手写几乎必然漏 case。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











