如何使用Laravel 5以人类可读的格式获取时间差?

42

我想展示当前日期和时间与 updated_at 列中存储的日期和时间之间的差异。但是,我希望它易于人理解,例如:

53 mins ago
2 hours ago
3 days ago

有没有函数可以帮我简化操作?

为确保大家理解我的意思,我们假设数据库中有一列(updated_at),它的值为 2015-06-22 20:00:03,而当前时间是 20:00:28。那么我想看到:

25 mins ago
当时间超过59分钟时,我只想显示小时数;当时间超过24小时时,我希望看到几天前。

看一下这个(在谷歌上找到的):这里 - m_pro_m
看一下DateTime类和diff方法在手册中的内容。 - RiggsFolly
1
你可以使用 Carbon,它是 Laravel 自带的。 - Stuart Wagner
4
哦,完全不是这样的,我在询问关于Laravel5中获取时间差异的特定和现有函数。 - Matthieu Boisjoli
8
这个问题正在 Meta 讨论中。 - Script47
4
这可能是使用Carbon和Blade计算两个日期之间的差异和/或以hh:mm:ss格式计算两个日期之间时间差异的Carbon方法的重复问题(摘自在第二次重新打开该问题之前列出的重复问题列表)。 - Makyen
3个回答

118

默认情况下,Eloquent将created_atupdated_at列转换为Carbon实例。因此,如果您使用Eloquent获取数据,则可以按以下方式执行。


$object->updated_at->diffForHumans();
如果您想自定义将自动更改的字段,则可以在模型中按照您的意愿自定义它们。
// Carbon instance fields
protected $dates = ['created_at', 'updated_at', 'deleted_at'];

1
补充这个答案,你不需要将'created_at'和'updated_at'添加到$dates数组中,因为它们会自动添加。如果要覆盖此设置并删除它们,请将$timestamps属性设置为false。 - usernotnull
这个解决方案是正确的,仍然适用于Laravel 10,谢谢Burak。 - Two

11

如果日期是以字符串形式存在,使用 Laravel Carbon;例如:

 {{ \Carbon\Carbon::parse($on_revision->assignment->deadline)->diffForhumans() }}

请注意,我将我的字符串包装在carbon::parse()中。

1
function timeDiff($firstTime, $lastTime): string
{
    $firstTime = strtotime($firstTime);
    $lastTime = strtotime($lastTime);

    $difference = $lastTime - $firstTime;

    $data['years'] = abs(floor($difference / 31536000));
    $data['days'] = abs(floor(($difference - ($data['years'] * 31536000)) / 86400));
    $data['hours'] = abs(floor(($difference - ($data['years'] * 31536000) - ($data['days'] * 86400)) / 3600));
    $data['minutes'] = abs(floor(($difference - ($data['years'] * 31536000) - ($data['days'] * 86400) - ($data['hours'] * 3600)) / 60));

    $timeString = '';

    if ($data['years'] > 0) {
        $timeString .= $data['years'] . " Years, ";
    }

    if ($data['days'] > 0) {
        $timeString .= $data['days'] . " Days, ";
    }

    if ($data['hours'] > 0) {
        $timeString .= $data['hours'] . " Hours, ";
    }

    if ($data['minutes'] > 0) {
        $timeString .= $data['minutes'] . " Minutes";
    }

    return $timeString;
}

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接