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

Laravel中如何基于日期与当前日期计算经验时长?

解决方案

首先确保你的模型已经将目标timestamp字段转为Carbon实例,Laravel默认会自动处理created_at/updated_at这类字段,如果是自定义字段,在模型里添加$casts配置:

protected $casts = [
    'your_timestamp_column' => 'datetime', // 替换成你的字段名
];

接下来可以通过访问器或者单独函数来生成你需要的格式:

方法一:模型访问器(推荐)

在对应模型中添加以下方法,这样可以直接通过模型属性获取格式化后的字符串:

use Carbon\Carbon;

public function getTimeDiffAttribute()
{
    $diff = $this->your_timestamp_column->diff(Carbon::now());
    $segments = [];

    // 优先处理年
    if ($diff->y > 0) {
        $segments[] = "{$diff->y}年";
    }
    // 处理月
    if ($diff->m > 0) {
        $segments[] = "{$diff->m}个月";
    }
    // 只有当年、月都为0时,才显示天数
    if (empty($segments) && $diff->d > 0) {
        $segments[] = "{$diff->d}天";
    }

    return implode(' ', $segments);
}

使用示例:

// 假设$model是你的模型实例
echo $model->time_diff; 
// 对应你的示例1会输出「8天」,示例2会输出「1年 1个月」

方法二:独立函数(适合非模型场景)

如果是单独处理某个日期字符串,可以用以下函数:

use Carbon\Carbon;

function formatTimeDiff(string $dateString): string
{
    $date = Carbon::parse($dateString);
    $diff = $date->diff(Carbon::now());
    $segments = [];

    if ($diff->y > 0) {
        $segments[] = "{$diff->y}年";
    }
    if ($diff->m > 0) {
        $segments[] = "{$diff->m}个月";
    }
    if (empty($segments) && $diff->d > 0) {
        $segments[] = "{$diff->d}天";
    }

    return implode(' ', $segments);
}

使用示例:

echo formatTimeDiff('2022-09-15 00:00:00'); // 输出「8天」
echo formatTimeDiff('2021-08-23 00:00:00'); // 输出「1年 1个月」

注意事项

  • 这里的差值是基于当前时间(Carbon::now())计算的,如果你需要基于某个固定时间计算,替换成对应的Carbon实例即可。
  • 如果需要更灵活的格式(比如同时显示年、月、天),可以调整$segments的判断逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:05:24