Как сравнить две временные метки углерода?

84

У меня есть две метки времени: edited_at, которые я создал, и created_at (Laravel's) ... В базе данных оба имеют метку времени типа и значение по умолчанию 0000-00-00 00:00:00 ... Но

var_dump(edited_at variable)дает строку. Пока var_dump(created_at variable)есть объект / Карбон. Что не так с этими отметками времени?

Я должен сравнить оба после преобразования в целое число с использованием формата ('U'). Я могу вызвать этот метод только для Carbon Object. Как я могу это сделать?

Хасан Сакиб
источник
Что именно вы хотите сравнить? вы хотите знать, что старше / новее?
lukasgeiter
да, я хочу жить в лагере старше / новее
Хасан Сакиб

Ответы:

196

Во-первых, Eloquent автоматически конвертирует свои временные метки ( created_at, updated_at) в углеродные объекты. Вы можете просто использовать updated_atэту замечательную функцию или указать edited_atв своей модели в $datesсвойстве:

protected $dates = ['edited_at'];

Теперь вернемся к вашему актуальному вопросу. В Carbon есть несколько функций сравнения:

  • eq() равно
  • ne() не равно
  • gt() лучше чем
  • gte() больше или равно
  • lt() меньше, чем
  • lte() меньше или равно

Применение:

if($model->edited_at->gt($model->created_at)){
    // edited at is newer than created at
}
Лукасгейтер
источник
2
Как я могу сравнивать только даты, а не время?
geckob
3
@geckob Наверное, самое простое$date1->toDateString() == $date2->toDateString()
lukasgeiter
Я тестирую, и можно использовать операторы сравнения для сравнения объектов Carbon. Это новая функция?
JCarlosR
При использовании не забывайте обрабатывать временные метки, допускающие значение NULL. Laravel просто преобразует SQL nullв PHP nullвместо объекта Carbon, и вы получите call to a member function lt() on null.
okdewit
вы должны использовать $ some_cabron_date-> endOfDay () или $ some_cabron_date-> startOfDay () с этими функциями для нужной операции
Виллиан Лопес
21

В Carbon есть несколько функций сравнения с мнемоническими именами :

  • равно()
  • notEqualTo ()
  • лучше чем()
  • больше или равно()
  • меньше, чем()
  • меньше или равно()

Применение:

 if($model->edited_at->greaterThan($model->created_at)){
     // edited at is newer than created at
 }

Действительно для nesbot / carbon 1.36.2

если вы не уверены, какая у вас версия Carbon, запустите эту

$composer show "nesbot/carbon"

документация: https://carbon.nesbot.com/docs/#api-comparison

Евгений Афанасьев
источник
3

Во-первых, преобразуйте метку времени с помощью встроенных красноречивых функций, как описано в этом ответе .

Тогда вы можете просто использовать функцию Carbon min()или max()для сравнения. Например:

$dt1 = Carbon::create(2012, 1, 1, 0, 0, 0); $dt2 = Carbon::create(2014, 1, 30, 0, 0, 0); echo $dt1->min($dt2);

Это будет echoменьшая из двух дат, как в данном случае $dt1.

См. Http://carbon.nesbot.com/docs/

джинна
источник
1

Вот как я сравниваю 2 даты, now () и дату из таблицы

@if (\Carbon\Carbon::now()->lte($item->client->event_date_from))
    .....
    .....
@endif

Должно работать в самый раз. Я использовал функции сравнения, предоставляемые Carbon.

хакерновичок
источник