Làm cách nào tôi có thể nhận được sự khác biệt giữa hai ngày trong laravel 8?

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: 1
0

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: 1
2

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: 1
3

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 gian

Vì 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

  1. Xây dựng truy vấn SQL sử dụng hàm SQL
    $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 để định dạng nội dung của cột là Y-m-d
  2. 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: 1
8

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: 1
9

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: 1
02,
$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
03 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: 1
04 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: 1
06 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: 1
07 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: 1
08in MySQL. Có hai lưu ý mặc dù

  1. Các chỉ mục chức năng chỉ khả dụng trên MySQL 8. 0. 13 trở lên
  2. 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[];
0

Và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[];
0

Và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ờ, . ]

Làm cách nào để trừ hai ngày trong laravel?

Bạn có thể trừ ngày vào ngày hiện tại bằng cách sử dụng carbon trong phiên bản laravel 6, laravel 7, laravel 8 và laravel 9. Nếu bạn cần trừ ngày hoặc nhiều ngày hơn thì bạn có thể sử dụng carbon trong laravel. carbon cung cấp phương thức sunDay[] và sunDays[] để thêm ngày vào đối tượng ngày carbon.

Làm cách nào để so sánh giữa hai ngày trong laravel?

Chúng ta có thể sử dụng các phương thức carbon eq[] hoặc equalTo[] để kiểm tra xem hai ngày đã cho có bằng nhau hay không
Sử dụng phương thức ne[] hoặc notEqualTo[] để xác định một ngày không bằng một ngày khác
gt[] hoặc lớn hơn Phương thức Than[] hoặc isAfter[] xác định xem một ngày có lớn hơn một ngày khác hay không

Làm cách nào để lấy ngày giữa hai ngày trong laravel?

Cố gắng làm một cái gì đó như thế này. $date1 = Cacbon. hôm nay[]->toDateString[]; . hôm nay[]->toDateString[]; . tìm[1];

Làm cách nào để tính tháng giữa hai ngày trong laravel?

$năm = Cacbon. now[]->diffInYears[$row->entry_date]; . now[]->diffInMonths[$row->entry_date]; . now[]->diffInDays[$row->entry_date]; . $tháng; . $ngày;

Chủ Đề