Trong ví dụ này, tôi sẽ giúp bạn Cách nhận sự khác biệt giữa hai ngày tính theo ngày bằng cách sử dụng carbon trong laravel. bạn cần nhận được sự khác biệt giữa hai ngày tính theo ngày bằng cách sử dụng carbon trong laravel. bạn chỉ có thể sử dụng phương thức diffInDays[] trong laravel
Trong ví dụ sau, bạn có thể thấy, chúng ta có hai ngày, biến $start_date đầu tiên và biến $end_date thứ hai. Hàm diffInDays của lớp carbon bằng cách sử dụng, bạn có thể nhận được sự khác biệt giữa hai ngày. Tôi hy vọng bạn sẽ tìm thấy giải pháp của bạn
Hôm nay, chúng tôi muốn chia sẻ với bạn Laravel Tính toán sự khác biệt giữa hai ngày. Trong bài đăng này, chúng tôi sẽ giới thiệu cho bạn Laravel 5. 7 Tính toán sự khác biệt giữa hai ngày, hãy nghe về Laravel Carbon Date Sự khác biệt giữa hai ngày, chúng tôi sẽ cung cấp cho bạn bản demo và ví dụ để thực hiện. Trong bài đăng này, chúng ta sẽ tìm hiểu về Tính chênh lệch giữa hai ngày bằng Laravel 5. 7 với một ví dụ
Laravel Tính toán sự khác biệt giữa hai ngày
nội dung
Có những điều sau đây Đơn giản về Laravel Tính toán sự khác biệt giữa hai ngày Thông tin đầy đủ với ví dụ và mã nguồn
Vì tôi sẽ trình bày Bài đăng này bằng ví dụ Hoạt động trực tiếp để phát triển Sự khác biệt giữa hai ngày carbon, do đó, Cách lấy chênh lệch ngày giữa hai ngày trong laravel 5. 7 cho ví dụ này như sau
ví dụ 1. Sự khác biệt giữa hai ngày carbon
Laravel Carbon Date Sự khác biệt giữa hai ngày
$end = Carbon::parse[$request->input['end_date']]; $current = Carbon::now[]; $length = $end->diffInDays[$current]; dd[$length];
ví dụ 2. nhận chênh lệch ngày giữa hai ngày trong laravel
$to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 1
ví dụ 3. Tìm ngày giữa hai ngày trong laravel
$from_date = $request->Fdate; $to_date = $request->Tdate; $first_datetime = new DateTime[$from_date]; $last_datetime = new DateTime[$to_date]; $interval = $first_datetime->diff[$last_datetime]; $final_days = $interval->format['%a'];//and then print do whatever you like with $final_days dd[$final_days];Hướng dẫn ứng dụng hoạt động góc 6 CRUD
Đọc
- Công nghệ
- Google Adsense
- lập trình
Nội dung tương tự. lấy chênh lệch ngày giữa hai ngày trong laravel, tính chênh lệch giữa hai ngày trong laravel, ví dụ về chênh lệch carbon giữa hai ngày tính theo ngày, lấy ngày giữa hai ngày laravel 5. 7, tính ngày giữa hai ngày trong php, php, ngày, chênh lệch, Carbon, diffInDays, ngày, laravel, giữa, diffInDays, get, how, two, example
Giả sử bạn có một blog có các bài đăng [hoặc một bảng quảng cáo có danh sách hoặc khách du lịch có các chuyến đi. bạn hiểu rồi] và bạn muốn truy xuất tất cả các bài đăng giữa hai ngày. Âm thanh quen thuộc ?
Cách tiếp cận thẳng thắn
Nó thực sự giống như một câu hỏi tầm thường với một câu trả lời dễ [nhưng hoàn toàn sai]. Chỉ cần sử dụng
$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
1 [hoặc trong Laravel $startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
2] như vậy$startDate = '2021-06-01';
$endDate = '2021-06-30';
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Tất cả chúng ta đã làm điều đó [ít nhất là tôi biết mình đã làm] để truy xuất tất cả các bài đăng được tạo vào tháng 6. Vấn đề ở đây là cột
$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
3 của chúng tôi thường là Ngày giờ, vì vậy nó không phải là ngày đơn giản mà còn có thời gian. Điều đó có nghĩa là trong thực tế, bất kỳ bài đăng nào được tạo vào ngày 30 sẽ không được truy xuất vì ngày tạo của chúng sẽ luôn lớn hơn 2021-06-30 [mà SQL sẽ giả sử có nghĩa là '2021-06-30 00. 00. 00']Hoặc có thể chúng tôi đang sử dụng Carbon và có thứ gì đó tương tự
$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Điều đó thậm chí còn tồi tệ hơn bởi vì nó trở nên hoàn toàn không thể đoán trước. Một phiên bản Carbon đại diện cho một thời điểm tức thì và nó cũng có thời gian, trừ khi bạn không chỉ định thời gian, nó sẽ mặc định là thời điểm hiện tại khi tập lệnh chạy. Vì vậy, nếu bạn chạy tập lệnh này lúc 9 giờ sáng và bài đăng được tạo lúc 8 giờ sáng ngày 30, bạn sẽ truy xuất nó. Nhưng chạy chính xác cùng một tập lệnh vào lúc 7 giờ sáng và bạn sẽ không truy xuất được bài đăng đó nữa vì $endDate thực sự sẽ là '2021-06-30 07. 00. 00'
Chúng tôi có thể sử dụng $endDate->toDateString[] để loại bỏ thời gian, nhưng chúng tôi sẽ rơi vào tình huống trên
Một cách tốt hơn với carbon
Một giải pháp là đảm bảo rằng chúng tôi chỉ định thời gian trong truy vấn của mình và thời gian này là vào đầu ngày cho ngày bắt đầu của chúng tôi [00. 00. 00] và vào cuối ngày cho ngày kết thúc của chúng tôi [23. 59. 59. 999999]
May mắn thay, Carbon cung cấp các phương thức
$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
4 và $startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
5 để thực hiện điều đó$to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 10
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Bây giờ điều đó đã tốt hơn nhiều, chúng tôi có thể khá chắc chắn rằng mọi thứ được tạo vào ngày 1 hoặc ngày 30 sẽ được truy xuất bất kể chúng được tạo vào thời gian nào hoặc vào thời điểm nào
Đó là một giải pháp vững chắc và bạn chắc chắn có thể sử dụng nó, nhưng việc thêm thời gian khi chúng ta thực sự chỉ quan tâm đến ngày tháng đối với tôi cảm thấy hơi khó chịu, vì vậy hãy xem một giải pháp khác
Một cách khác với MySQL
Chúng tôi cũng có thể nói rõ ràng với MySQL rằng chúng tôi chỉ quan tâm đến ngày tháng bằng cách sử dụng
$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
6. Truy vấn chúng tôi muốn là đây$to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 12
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Bằng cách đó, chúng tôi sẽ so sánh ngày với ngày chứ không phải với Ngày giờ. Chúng ta sẽ cần dùng đến DB. raw[] để sao chép cái này với Eloquent, trông sẽ như thế này
$to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 13
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Lý tưởng nhất là chúng ta nên đảm bảo rằng
$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
7 và $startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
8 được định dạng đúng theo ngày, nhưng có vẻ như nó vẫn hoạt động ngay cả khi chúng ta chuyển một đối tượng Carbon đầy đủ [được tự động chuyển thành chuỗi] vì MySQL sẽ bỏ qua phần thời gianVì vậy, đó là một cách khác để làm điều đó, nhưng tôi không phải là người thích sử dụng DB. raw[], cộng với nó có thể chậm hơn [thêm về điều đó trong đoạn cuối]. Vì vậy, hãy xem giải pháp cuối cùng tận dụng Eloquent để giải quyết vấn đề đó
Một cách khác với Eloquent
Eloquent cung cấp một phương pháp
$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
9 rất hữu ích sẽ làm được hai việc- Xây dựng truy vấn SQL sử dụng hàm SQL
6 để định dạng nội dung của cột là Y-m-d$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01']; $endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30']; $posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
- Truyền đúng đối tượng Carbon hoặc Datetime sang định dạng Y-m-d trước khi so sánh nó
Sử dụng điều này, chúng tôi có thể tự tin vượt qua các phiên bản Carbon và biết rằng bất kỳ thời điểm nào xảy ra là một phần của nó sẽ bị loại bỏ và chúng tôi thực sự sẽ tìm kiếm giữa hai ngày
$to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 18
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Điều này sẽ tạo truy vấn SQL này
$to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 19
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Và nó hoạt động hoàn hảo. Nhược điểm duy nhất là chúng ta không thể sử dụng giữa nên viết hơi lâu hơn một chút, nhưng nếu chúng ta định sử dụng nó ở một số nơi, chúng ta có thể dễ dàng viết một phạm vi [và thậm chí có thể làm cho nó chung chung để có thể
$from_date = $request->Fdate; $to_date = $request->Tdate; $first_datetime = new DateTime[$from_date]; $last_datetime = new DateTime[$to_date]; $interval = $first_datetime->diff[$last_datetime]; $final_days = $interval->format['%a'];//and then print do whatever you like with $final_days dd[$final_days];0
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Và sử dụng nó thay thế
$from_date = $request->Fdate; $to_date = $request->Tdate; $first_datetime = new DateTime[$from_date]; $last_datetime = new DateTime[$to_date]; $interval = $first_datetime->diff[$last_datetime]; $final_days = $interval->format['%a'];//and then print do whatever you like with $final_days dd[$final_days];1
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Bây giờ điều đó có vẻ khá tốt với tôi. Thật không may, nó có thể không phải là giải pháp nhanh nhất
Còn hiệu suất thì sao?
Ghi chú. Đây không phải là một phần của bài viết gốc và ai đó trên Linkedin đã hỏi tôi "còn hiệu suất thì sao". Điều này đã mở ra một loạt sâu mới mà tôi không thực sự lường trước được [điều mà Oliver cũng đã chỉ ra trong phần bình luận]
Tất cả các cách tiếp cận ở trên đều có cùng hiệu suất nếu bạn không có bất kỳ chỉ mục nào trên cột created_at, điều này có thể ổn nếu bạn cần lọc vài chục hoặc hàng trăm mô hình theo ngày, nhưng nếu bạn bắt đầu làm việc với nhiều . Mọi thứ trở nên lộn xộn
Nếu bạn tạo một chỉ mục đơn giản trên cột
$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
3, phương pháp Carbon sử dụng $to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 102,
$to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 103 và
$to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 104 sẽ nhanh hơn rất nhiều vì nó có thể tận dụng chỉ mục
Thật không may, bất cứ thứ gì liên quan đến hàm
$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
6, bằng cách sử dụng hàm $to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 106 hoặc hàm
$to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 107 của Laravel sẽ không thể sử dụng chỉ mục đó vì nó chứa dấu thời gian
Giải pháp lý thuyết cho vấn đề này là tạo một trên
$to_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-5 3:30:34']; $from_date = \Carbon\Carbon::createFromFormat['Y-m-d H:s:i', '2020-5-6 9:30:34']; $answer_in_days = $to_date->diffInDays[$from_date]; print_r[$answer_in_days]; // Output: 108in MySQL. Có hai lưu ý mặc dù
- Các chỉ mục chức năng chỉ khả dụng trên MySQL 8. 0. 13 trở lên
- Vì một số lý do mà tôi không thể hiểu được, chỉ mục chức năng không được sử dụng khi sử dụng các câu lệnh đã chuẩn bị. Vì vậy, để nó hoạt động, bạn cũng phải sử dụng các câu lệnh đã chuẩn bị được mô phỏng của PDO, đây không phải là cách được đề xuất
Vì vậy, nói chung, khuyến nghị cuối cùng của tôi là gắn bó với Carbon để bắt đầu và kết thúc một ngày. Và chúng tôi vẫn có thể sử dụng một phạm vi cho điều đó để dễ sử dụng hơn [chúng tôi cũng sẽ làm cho nó chấp nhận một phiên bản Carbon hoặc một chuỗi]
$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
0Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Và chúng ta có thể sử dụng nó như vậy
$startDate = Carbon::createFromFormat['Y-m-d', '2021-06-01'];
$endDate = Carbon::createFromFormat['Y-m-d', '2021-06-30'];
$posts = Post::whereBetween['created_at', [$startDate, $endDate]]->get[];
0Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Phần kết luận
Đối mặt với thời gian thật khó. Tôi thấy rằng khi xử lý ngày và giờ, ngay cả khi nó có vẻ đơn giản, bạn nên dành thêm một phút để tự hỏi liệu nó có thực sự đơn giản như vậy không và liệu bạn có bỏ sót điều gì không [và chúng ta thậm chí còn chưa chạm vào múi giờ, . ]