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

是否存在可根据时间戳与当前日期先后生成可读时间差的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;
}

代码说明

  1. 依赖PHP内置的DateTime类处理时间,自动规避手动计算时间差的复杂问题(如闰年、不同月份天数差异)
  2. 通过时间对象的比较判断目标时间属于过去还是未来
  3. 提取时间间隔中的年、月、日、时、分等非零部分,并自动处理单复数(比如1 year和5 years)
  4. 支持目标时间等于当前时间的边界场景

测试示例

// 测试过去的时间戳(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:46:09