Làm thế nào để so sánh hai Dấu thời gian Carbon?


83

Tôi có hai dấu thời gian, edit_at mà tôi đã tạo và create_at (Laravel's) ... Trong cơ sở dữ liệu, cả hai đều có dấu thời gian loại và giá trị mặc định 0000-00-00 00:00:00 ... Nhưng

var_dump(edited_at variable)đang cho chuỗi. While var_dump(created_at variable)là vật thể / Carbon. Có gì sai với những dấu thời gian này?

Tôi phải so sánh cả hai sau khi chuyển đổi thành số nguyên bằng cách sử dụng định dạng ('U'). Tôi chỉ có thể gọi phương pháp này trên Vật thể Carbon. Làm thế nào tôi có thể làm điều đó?


Bạn muốn so sánh chính xác điều gì? bạn có muốn biết cái nào cũ hơn / mới hơn không?
lukasgeiter

vâng, tôi muốn campare cũ / mới
Hassan Saqib

Câu trả lời:


189

Đầu tiên, Eloquent tự động chuyển đổi dấu thời gian ( created_at, updated_at) của nó thành các vật thể carbon. Bạn chỉ có thể sử dụng updated_atđể có được tính năng tuyệt vời đó hoặc chỉ định edited_attrong mô hình của bạn trong thuộc $datestính:

protected $dates = ['edited_at'];

Bây giờ trở lại câu hỏi thực tế của bạn. Carbon có một loạt các chức năng so sánh:

  • eq() bằng
  • ne() không bằng
  • gt() lớn hơn
  • gte() lớn hơn hoặc bằng
  • lt() ít hơn
  • lte() nhỏ hơn hoặc bằng

Sử dụng:

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

2
Làm cách nào tôi có thể so sánh chỉ ngày và không phải giờ?
geckob

3
@geckob Có lẽ dễ nhất là làm$date1->toDateString() == $date2->toDateString()
lukasgeiter

Tôi đang thử nghiệm và có thể sử dụng các toán tử so sánh để so sánh các đối tượng Carbon. Nó là một tính năng mới?
JCarlosR

Khi sử dụng điều này, hãy nhớ xử lý dấu thời gian có thể vô hiệu. Laravel sẽ chỉ chuyển SQL nullthành PHP nullthay vì đối tượng Carbon, và bạn sẽ nhận được call to a member function lt() on null.
okdewit

bạn nên sử dụng $ some_cabron_date-> endOfDay () hoặc $ some_cabron_date-> startOfDay () với chức năng mà đến hoạt động mong muốn
Williaan Lopes

21

Carbon có một loạt các chức năng so sánh với các tên dễ nhớ :

  • tương đương với()
  • notEqualTo ()
  • lớn hơn()
  • lớn hơn hoặc bằng()
  • ít hơn()
  • ít hơn hoặc bằng()

Sử dụng:

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

Hợp lệ cho nesbot / carbon 1.36.2

nếu bạn không chắc mình đang sử dụng phiên bản Carbon nào, hãy chạy

$composer show "nesbot/carbon"

tài liệu: https://carbon.nesbot.com/docs/#api-comparison


3

Đầu tiên, chuyển đổi dấu thời gian bằng cách sử dụng chức năng hùng hồn tích hợp, như được mô tả trong câu trả lời này .

Sau đó, bạn chỉ có thể sử dụng Carbon's min()hoặc max()chức năng để so sánh. Ví dụ:

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

Điều này sẽ echoít hơn trong hai ngày, trong trường hợp này là $dt1.

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


1

Đây là cách tôi so sánh 2 ngày, bây giờ () và một ngày từ bảng

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

Nên làm việc vừa phải. Tôi đã sử dụng các chức năng so sánh do Carbon cung cấp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.