使用 Carbon 返回易读的时间差异

74

我正在使用 Laravel 4 创建我的项目。

我目前正在构建评论部分,并且想要显示帖子创建的时间,类似于 Facebook 的“10分钟前”和“2周前”等。

我做了一些研究,发现一个名为Carbon 的包可以实现这个功能。

在阅读 Laravel 文档后,它说:

默认情况下,Eloquent 会将 created_atupdated_atdeleted_at 列转换为 Carbon 实例,提供了各种有用的方法,并扩展了本机 PHP 的 DateTime 类。

但是当我返回我创建的日期列时,它不像 Facebook 那样显示。

我正在使用以下代码:

return array('time');

有人使用过这个Carbon包并能帮助我完成我需要的工作吗?我感到相当困惑。

5个回答

162

默认情况下,Eloquent将created_at、updated_at和deleted_at列转换为Carbon实例。因此,您的代码应该像这样:

$comment->created_at->diffForHumans();

这很酷。它会生成像2分钟前1天前这样的字符串。不管是单数还是复数,秒、分钟、小时、天、周还是年,它都可以自动运行。我已在Laravel 4.1.24版本上进行了测试。


可以获取剩余时间吗? - Nabil Lemsieh
Carbon 文档 中提到了 ... 还支持 'from now', 'after' 和 'before'。 - Ifan Iqbal
我收到了一个在空对象上调用diffForHumans()成员函数的错误。 - Fernando Torres
@FernandoTorres 你的日期必须为空,首先检查一下,然后再执行以下操作: Carbon::parse('在此输入你的日期')->diffForHumans(); - Shaz

126
如果你想了解所需内容,可以阅读Carbon文档并调用diffForHumans()方法。
<?php echo \Carbon\Carbon::createFromTimeStamp(strtotime($comment->created_at))->diffForHumans() ?>

68
正如问题中引用的Laravel文档所解释的那样,实际上很简单; $comment->created_at默认已经是一个Carbon对象,所以你只需要这样做:$bookmark->created_at->diffForHumans() - Joel Mellon
我正在使用laravel 5.2,并且使用了相同的方法,但它没有显示正确的结果。例如,如果我在2秒钟前发布评论,则会显示“4小时前”。 - Mohammad Tasneem Faizyab
@JoelMellon,你怎么知道这个宝石,你在做Laravel吗?该死... - Irfandi D. Vendy
@JoelMellon 在空对象上调用了 diffForHumans() 方法。 - Fernando Torres
@FernandoTorres 您的模型的 created_at 属性为空。需要设置才能正常工作。我猜测您的模型没有被持久化到数据库中,即没有被创建,或者您的迁移没有为 created_at 设置默认值。 - Joel Mellon

10

适用于任何版本的Laravel

$message->updated_at->diffForHumans();

1
5年前已经回答了。 - Mariano Argañaraz

3
Carbon::parse($p->created_at)->diffForHumans();

2

使用以下代码来显示“多久之前”:

    public function time_elapsed_string($datetime, $full = false) {
    $now = new DateTime;
    $ago = new DateTime($datetime);
    $diff = $now->diff($ago);

    $diff->w = floor($diff->d / 7);
    $diff->d -= $diff->w * 7;

    $string = array(
         'y' => 'year',
         'm' => 'month',
         'w' => 'week',
         'd' => 'day',
         'h' => 'hour',
         'i' => 'minute',
         's' => 'second',
     );
     foreach ($string as $k => &$v) {
         if ($diff->$k) {
             $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
         } else {
             unset($string[$k]);
         }
     }

     if (!$full) $string = array_slice($string, 0, 1);
     return $string ? implode(', ', $string) . ' ago' : 'just now';
 }

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