74

I'm using Laravel 4 to create my project.

I am currently building the comments section and I want to display how long ago the post was created, kind of like Facebook's '10 mins ago' & '2 weeks ago' etc.

I have done a little bit of research and found that a package called Carbon can do this.

After reading the Laravel doc's, it says:

By default, Eloquent will convert the created_at, updated_at, and deleted_at columns to instances of Carbon, which provides an assortment of helpful methods, and extends the native PHP DateTime class.

But when I return a date column that I have created, it doesn't display it like on Facebook.

The code that I'm using is:

return array('time');

Has any body used this Carbon package that could give me a hand in doing what I need, I'm quite confused.

Emile Bergeron
  • 17,074
  • 5
  • 83
  • 129
BigJobbies
  • 3,633
  • 11
  • 43
  • 66

5 Answers5

162

By default, Eloquent will convert the created_at, updated_at, and deleted_at columns to instances of Carbon. So, your code should be just like this:

$comment->created_at->diffForHumans();

It's very cool. It'll produce string like 2 minutes ago or 1 day ago. Plurar or singular, seconds, minutes, hours, days, weeks, or years, it runs automatically. I've tested it on Laravel version 4.1.24.

Ifan Iqbal
  • 3,053
  • 5
  • 28
  • 31
126

If you read the Carbon docs to get what you want you call the diffForHumans() method.

<?php echo \Carbon\Carbon::createFromTimeStamp(strtotime($comment->created_at))->diffForHumans() ?>
Altrim
  • 6,536
  • 4
  • 33
  • 36
  • 68
    It's actually much simpler as the quoted bit from Laravel's documentation in the question explains; `$comment->created_at` is already a Carbon object by default so all you need to do is: `$bookmark->created_at->diffForHumans()` – Joel Mellon Jan 10 '14 at 00:31
  • I am using laravel 5.2 and used the same method but it is not showing correct result. e.g If I post comment 2seconds ago, it displays '4 hours ago'. – Mohammad Tasneem Faizyab Nov 14 '16 at 12:58
  • @JoelMellon, how do you know this gem, are you working on laravel? damn... – Irfandi D. Vendy Apr 14 '20 at 19:00
  • @JoelMellon Call to a member function diffForHumans() on null – Fernando Torres Dec 11 '20 at 21:12
  • @FernandoTorres Your model's `created_at` attribute is null. It needs to be set for this to work. My guess is that your model wasn't persisted to the database, ie. wasn't created, or your migration doesn't set a default value for created_at. – Joel Mellon Dec 16 '20 at 17:25
10

For any version of Laravel

$message->updated_at->diffForHumans();
Rahul Hirve
  • 1,109
  • 13
  • 20
3
Carbon::parse($p->created_at)->diffForHumans();
Jignesh Joisar
  • 13,720
  • 5
  • 57
  • 57
Hari Pudyal
  • 91
  • 1
  • 3
2

use this code for time ago :

    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';
 }
Suvin94
  • 283
  • 9
  • 30
fdyahk
  • 35
  • 3