是否存在可根据时间戳与当前日期先后生成可读时间差的PHP函数?
实现PHP时间戳差值的可读描述函数
PHP没有原生函数直接实现你需要的功能,但可以利用DateTime和DateInterval类快速自定义一个满足需求的函数,以下是具体实现:
function since_or_in_func($targetTimestamp) { $currentTime = new DateTime(); $targetTime = (new DateTime())->setTimestamp((int)$targetTimestamp); // 判断目标时间是过去还是未来 $isPast = $targetTime < $currentTime; // 计算时间间隔(统一用大的时间减去小的,避免负数) $interval = $isPast ? $currentTime->diff($targetTime) : $targetTime->diff($currentTime); $parts = []; // 按优先级提取非零的时间部分,处理单复数 if ($interval->y > 0) { $parts[] = $interval->y . ' year' . ($interval->y > 1 ? 's' : ''); } if ($interval->m > 0) { $parts[] = $interval->m . ' month' . ($interval->m > 1 ? 's' : ''); } if ($interval->d > 0) { $parts[] = $interval->d . ' day' . ($interval->d > 1 ? 's' : ''); } if ($interval->h > 0) { $parts[] = $interval->h . ' hour' . ($interval->h > 1 ? 's' : ''); } if ($interval->i > 0) { $parts[] = $interval->i . ' minute' . ($interval->i > 1 ? 's' : ''); } // 处理目标时间等于当前时间的情况 if (empty($parts)) { return 'Just now'; } // 拼接最终描述 $timeString = implode(', ', $parts); return $isPast ? $timeString . ' ago' : 'In ' . $timeString; }
代码说明
- 依赖PHP内置的
DateTime类处理时间,自动规避手动计算时间差的复杂问题(如闰年、不同月份天数差异) - 通过时间对象的比较判断目标时间属于过去还是未来
- 提取时间间隔中的年、月、日、时、分等非零部分,并自动处理单复数(比如
1 year和5 years) - 支持目标时间等于当前时间的边界场景
测试示例
// 测试过去的时间戳(2016-09-21 16:29:06) echo since_or_in_func('1474475346'); // 输出示例:6 years, 1 month, 28 days, 0 hours, 9 minutes ago(结果随当前时间变化) // 测试未来的时间戳(2026-09-30 22:37:34) echo since_or_in_func('1790807854'); // 输出示例:In 3 years, 10 months, 11 days, 6 hours, 59 minutes(结果随当前时间变化)
如果需要调整显示的时间粒度(比如只显示前2个非零时间单位),可以修改提取$parts的逻辑,比如只保留数组前两项即可。
内容的提问来源于stack exchange,提问作者Samir
相关产品推荐
相关产品推荐

