Использование углерода для возврата удобочитаемой разницы между датой и временем

Я использую Laravel 4 для создания своего проекта.

В настоящее время я создаю раздел комментариев, и я хочу показать, как давно был создан пост, вроде как Facebook «10 минут назад» и «2 недели назад» и т. Д. .

Я провел небольшое исследование и обнаружил, что пакет под названием Carbon может сделай это.

После прочтения документации Laravel он говорит:

По умолчанию Eloquent преобразует столбцы created_at, updated_at и deleted_at в экземпляры Carbon, что обеспечивает набор полезных методов и расширяет собственный класс PHP DateTime.

Но когда я возвращаю столбец даты, который я создал, он не отображает его, как на Facebook.

Код, который я использую:

return array('time');

Я очень запутался, использовал ли кто-нибудь этот углеродный пакет, который мог бы помочь мне сделать то, что мне нужно.


person BigJobbies    schedule 23.06.2013    source источник


Ответы (4)


Если вы читаете документацию по Carbon, чтобы получить то, что вам нужно, вы вызываете метод diffForHumans().

<?php echo \Carbon\Carbon::createFromTimeStamp(strtotime($comment->created_at))->diffForHumans() ?>
person Altrim    schedule 23.06.2013
comment
На самом деле это намного проще, как объясняет процитированный бит из документации Laravel в вопросе; $comment->created_at по умолчанию уже является объектом Carbon, поэтому все, что вам нужно сделать, это: $bookmark->created_at->diffForHumans() - person Joel Mellon; 10.01.2014
comment
Я использую laravel 5.2 и использовал тот же метод, но он не показывает правильный результат. например, если я отправлю комментарий 2 секунды назад, он отобразит «4 часа назад». - person Mohammad Tasneem Faizyab; 14.11.2016
comment
@JoelMellon, откуда ты знаешь этот драгоценный камень, ты работаешь над laravel? проклятие... - person Irfandi D. Vendy; 14.04.2020
comment
@JoelMellon Вызов функции-члена diffForHumans () при нулевом значении - person Fernando Torres; 12.12.2020
comment
@FernandoTorres Атрибут created_at вашей модели равен нулю. Его необходимо настроить, чтобы это работало. Я предполагаю, что ваша модель не сохранялась в базе данных, т.е. не был создан, или ваша миграция не устанавливает значение по умолчанию для created_at. - person Joel Mellon; 16.12.2020

По умолчанию Eloquent преобразует столбцы created_at, updated_at и deleted_at в экземпляры Carbon. Итак, ваш код должен быть таким:

$comment->created_at->diffForHumans();

Это очень круто. Он выдаст строку типа 2 minutes ago или 1 day ago. Множественное или единственное число, секунды, минуты, часы, дни, недели или годы, он запускается автоматически. Я тестировал его на Laravel версии 4.1.24.

person Ifan Iqbal    schedule 22.05.2014
comment
Можно ли получить оставшееся время? - person Nabil Lemsieh; 19.07.2014
comment
В Carbon документации сказано ... but also does 'from now', 'after' and 'before'. - person Ifan Iqbal; 19.07.2014
comment
Я получаю вызов функции-члена diffForHumans () на null - person Fernando Torres; 12.12.2020

Для любой версии Laravel

$message->updated_at->diffForHumans();
person Rahul Hirve    schedule 08.01.2018

используйте этот код для времени назад:

    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';
 }
person fdyahk    schedule 22.03.2016