Jak porównać dwa znaczniki czasu węgla?

84

Mam dwa znaczniki czasu, edited_at, który utworzyłem i utworzyłem_at (Laravel) ... W bazie danych oba mają typ timestamp i wartość domyślną 0000-00-00 00:00:00 ... Ale

var_dump(edited_at variable)podaje ciąg. Podczas gdy var_dump(created_at variable)jest obiektem / węglem. Co jest nie tak z tymi sygnaturami czasowymi?

Muszę porównać oba po konwersji na liczbę całkowitą przy użyciu formatu („U”). Mogę wywołać tę metodę tylko w Carbon Object. Jak mogę to zrobić?

Hassan Saqib
źródło
Co dokładnie chcesz porównać? chcesz wiedzieć, który jest starszy / nowszy?
lukasgeiter
tak, chcę obozować starsze / nowsze
Hassan Saqib

Odpowiedzi:

196

Po pierwsze, Eloquent automatycznie konwertuje swoje znaczniki czasu ( created_at, updated_at) na obiekty węglowe. Możesz po prostu użyć updated_attej fajnej funkcji lub określić edited_atw swoim modelu we $dateswłaściwości:

protected $dates = ['edited_at'];

Wróćmy teraz do twojego aktualnego pytania. Węgiel ma wiele funkcji porównawczych:

  • eq() równa się
  • ne() nie jest równy
  • gt() Lepszy niż
  • gte() większy lub równy
  • lt() mniej niż
  • lte() mniejszy lub równy

Stosowanie:

if($model->edited_at->gt($model->created_at)){
    // edited at is newer than created at
}
lukasgeiter
źródło
2
Jak mogę porównać tylko daty, a nie godzinę?
geckob
3
@geckob Najłatwiej jest prawdopodobnie zrobić$date1->toDateString() == $date2->toDateString()
lukasgeiter
Testuję i jest możliwe użycie operatorów porównania do porównania obiektów Carbon. Czy to nowa funkcja?
JCarlosR
Korzystając z tego, pamiętaj o obsłudze znaczników czasu dopuszczających wartość null. Laravel po prostu przekonwertuje SQL nulldo PHP nullzamiast obiektu Carbon, a otrzymasz call to a member function lt() on null.
okdewit
powinieneś użyć $ some_cabron_date-> endOfDay () lub $ some_cabron_date-> startOfDay () z tymi funkcjami do żądanej operacji
Williaan Lopes
21

Carbon ma wiele funkcji porównawczych o nazwach mnemonicznych :

  • równy()
  • notEqualTo ()
  • Lepszy niż()
  • większe bądź równe()
  • mniej niż()
  • mniejszy lub równy()

Stosowanie:

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

Obowiązuje dla nesbot / carbon 1.36.2

jeśli nie jesteś pewien, na jakiej wersji Carbon jesteś, uruchom to

$composer show "nesbot/carbon"

dokumentacja: https://carbon.nesbot.com/docs/#api-comparison

Yevgeniy Afanasyev
źródło
3

Najpierw przekonwertuj znacznik czasu za pomocą wbudowanej funkcji elokwentnej, zgodnie z opisem w tej odpowiedzi .

Następnie możesz po prostu użyć funkcji Carbon min()lub max()dla porównania. Na przykład:

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

Będzie echoto mniejsza z dwóch dat, czyli w tym przypadku $dt1.

Zobacz http://carbon.nesbot.com/docs/

ginna
źródło
1

W ten sposób porównuję 2 daty, teraz () i datę z tabeli

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

Powinien działać dobrze. Skorzystałem z funkcji porównawczych udostępnionych przez Carbon.

hackernewbie
źródło