
本文介绍如何使用 PHP 将 MySQL 中的 created_at 时间戳(如 '2022-05-15 00:49:59')动态计算并输出为“2小时 ago”“3天前”等人类可读的相对时间格式。
本文介绍如何使用 php 将 mysql 中的 `created_at` 时间戳(如 `'2022-05-15 00:49:59'`)动态计算并输出为“2小时 ago”“3天前”等人类可读的相对时间格式。
在 Web 开发中,直接显示原始数据库时间(如 2022-05-15 00:49:59)往往缺乏用户体验。更友好的做法是将其转换为相对时间(Relative Time),例如:
- 2 minutes ago
- 1 day ago
- 3 weeks ago
- Just now
PHP 提供了多种方式实现该功能,最常用且可靠的是结合 strtotime() 与时间差逻辑,或使用现代 DateTime 类封装成复用函数。
✅ 推荐实现:使用 DateTime 类(推荐,更健壮、支持时区)
function timeAgo($createdAt) {
$then = new DateTime($createdAt);
$now = new DateTime();
$diff = $now->diff($then);
// 构建可读字符串(按时间粒度降序判断)
if ($diff->y > 0) {
return $diff->y . ' year' . ($diff->y > 1 ? 's' : '') . ' ago';
} elseif ($diff->m > 0) {
return $diff->m . ' month' . ($diff->m > 1 ? 's' : '') . ' ago';
} elseif ($diff->d > 0) {
return $diff->d . ' day' . ($diff->d > 1 ? 's' : '') . ' ago';
} elseif ($diff->h > 0) {
return $diff->h . ' hour' . ($diff->h > 1 ? 's' : '') . ' ago';
} elseif ($diff->i > 0) {
return $diff->i . ' minute' . ($diff->i > 1 ? 's' : '') . ' ago';
} else {
return 'Just now';
}
}
// 示例:从数据库查询结果中获取 created_at 字段
$created_at = '2024-06-10 14:22:35'; // 格式需为 Y-m-d H:i:s(MySQL 默认 DATETIME 格式)
echo timeAgo($created_at); // 输出类似:2 hours ago
⚠️ 注意事项:
- 确保 $created_at 是标准 ISO/MySQL 格式(如 '2024-06-10 14:22:35'),若数据库存为 Unix 时间戳(int),请先用 date('Y-m-d H:i:s', $timestamp) 转换;
- 若数据来自不同地区,建议统一设置时区(如 date_default_timezone_set('Asia/Shanghai'))或在 DateTime 初始化时指定;
- 避免直接使用 time() - strtotime($created_at) 计算秒数后硬编码判断(易出错、不可维护),DateTime::diff() 更准确、支持闰年/月末等边界。
? 兼容旧写法(基于时间戳差值)
若项目仍使用较老 PHP 版本(
function timeAgoLegacy($createdAt) {
$then = strtotime($createdAt);
$now = time();
$diff = $now - $then;
if ($diff <h3>✅ 最佳实践建议</h3>
- 在数据库查询中尽量使用 DATETIME 或 TIMESTAMP 类型,并确保时区一致;
- 对高频调用场景(如列表页),可考虑在 SQL 层用 TIMESTAMPDIFF() 预计算(但灵活性较低);
- 如需国际化(多语言支持),建议集成 intl 扩展或使用 Carbon 库(Carbon::parse($date)->diffForHumans());
- 始终对 $createdAt 做空值/格式校验,避免 strtotime() 返回 false 导致逻辑错误。
通过以上方法,你就能将冷冰冰的 SQL 时间字段,优雅地转化为用户一眼可懂的“时间感知”表达。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











