Kiểm tra ngày giữa hai ngày trong PHP

Trong bài đăng này, chúng tôi sẽ cung cấp cho bạn thông tin về PHP Kiểm tra xem ngày hiện tại có nằm giữa hai ngày không ví dụ. Nghe này, chúng tôi sẽ cung cấp cho bạn thông tin chi tiết về PHP Kiểm tra xem ngày hiện tại có nằm giữa hai ngày không. Ví dụ về cách sử dụng và cung cấp cho bạn bản demo cho nó nếu cần thiết

Trong ví dụ này, tôi muốn chia sẻ với bạn một ví dụ nhỏ về cách kiểm tra ngày hiện tại nằm giữa ngày bắt đầu và ngày kết thúc trong php. chúng tôi sẽ kiểm tra xem ngày hôm nay có nằm giữa hai ngày trong php không. chúng ta có thể chỉ cần kiểm tra xem ngày hiện tại có nằm giữa hai ngày trong php không

Tôi đã viết nó rất đơn giản để bạn cũng có thể sử dụng với laravel, codeigniter, zend php framework cũng được. đó là mã php cốt lõi để kiểm tra xem ngày có nằm giữa hai ngày không php

Nhiều lần chúng tôi yêu cầu kiểm tra ngày hiện tại có nằm trong khoảng từ hai ngày đã cho hay không đối với đăng ký, bản dùng thử, thời gian hết hạn của người dùng, v.v. vì vậy khi người dùng đăng ký vào thời điểm đó sẽ quyết định khi nào anh ta sẽ hết hạn và chúng tôi sẽ luôn kiểm tra nó với ngày hiện tại. vì vậy có thể bài đăng này có thể giúp bạn kiểm tra xem ngày có tồn tại giữa hai ngày trong php không

Bạn có thể kiểm tra ví dụ đơn giản dưới đây để nó có thể giúp bạn

Ví dụ

$currentDate = date('Y-m-d');

$currentDate = date('Y-m-d', strtotime($currentDate));

$startDate = date('Y-m-d', strtotime("01/09/2019"));

$endDate = date('Y-m-d', strtotime("01/10/2019"));

if (($currentDate >= $startDate) && ($currentDate

echo "Current date is between two dates";

}else{

echo "Current date is not between two dates";

}

Nếu ngày hiện tại là 09/10/2019 thì nó sẽ trả về đầu ra dưới đây

đầu ra

Xem thêm. Làm cách nào để thay đổi định dạng ngày tháng trong PHP?

Current date is between two dates

Tôi hy vọng nó có thể giúp bạn…

Hy vọng mã và bài đăng này sẽ giúp bạn triển khai PHP Kiểm tra xem ngày hiện tại có nằm giữa hai ngày không ví dụ. nếu bạn cần bất kỳ trợ giúp hoặc bất kỳ phản hồi nào, hãy đưa ra trong phần bình luận hoặc bạn có ý tưởng hay về bài đăng này, bạn có thể đưa ra phần bình luận. Nhận xét của bạn sẽ giúp chúng tôi giúp bạn nhiều hơn và cải thiện chúng tôi. chúng tôi cũng sẽ cung cấp cho bạn loại bài đăng thú vị hơn này trong phần nổi bật, Để có bài đăng và mã thú vị hơn Hãy tiếp tục đọc blog của chúng tôi

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 đó

$startDate = Carbon::createFromFormat('Y-m-d', '2021-06-01')->startOfDay();
$endDate = Carbon::createFromFormat('Y-m-d', '2021-06-30')->endOfDay();

$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

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

Current date is between two dates

1

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

Current date is between two dates

2

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

Current date is between two dates

7

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

Current date is between two dates

8

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ể

Current date is between two dates

9

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ế

$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

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
$startDate = Carbon::createFromFormat('Y-m-d', '2021-06-01')->startOfDay();
$endDate = Carbon::createFromFormat('Y-m-d', '2021-06-30')->endOfDay();

$posts = Post::whereBetween('created_at', [$startDate, $endDate])->get();
2,
$startDate = Carbon::createFromFormat('Y-m-d', '2021-06-01')->startOfDay();
$endDate = Carbon::createFromFormat('Y-m-d', '2021-06-30')->endOfDay();

$posts = Post::whereBetween('created_at', [$startDate, $endDate])->get();
3 và
$startDate = Carbon::createFromFormat('Y-m-d', '2021-06-01')->startOfDay();
$endDate = Carbon::createFromFormat('Y-m-d', '2021-06-30')->endOfDay();

$posts = Post::whereBetween('created_at', [$startDate, $endDate])->get();
4 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 kỳ 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
$startDate = Carbon::createFromFormat('Y-m-d', '2021-06-01')->startOfDay();
$endDate = Carbon::createFromFormat('Y-m-d', '2021-06-30')->endOfDay();

$posts = Post::whereBetween('created_at', [$startDate, $endDate])->get();
6 hoặc hàm
$startDate = Carbon::createFromFormat('Y-m-d', '2021-06-01')->startOfDay();
$endDate = Carbon::createFromFormat('Y-m-d', '2021-06-30')->endOfDay();

$posts = Post::whereBetween('created_at', [$startDate, $endDate])->get();
7 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 chỉ mục chức năng trên

$startDate = Carbon::createFromFormat('Y-m-d', '2021-06-01')->startOfDay();
$endDate = Carbon::createFromFormat('Y-m-d', '2021-06-30')->endOfDay();

$posts = Post::whereBetween('created_at', [$startDate, $endDate])->get();
8in 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();
9

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 để kiểm tra ngày giữa hai ngày trong PHP?

hàm php displayDates($date1, $date2, $format = 'd-m-Y' ) { $dates = array();

Làm cách nào để kiểm tra ngày hiện tại nằm giữa startDate và endDate trong PHP?

Thử cái này.

Làm cách nào để kiểm tra xem một giá trị có phải là ngày hay không trong PHP?

Hàm PHP checkdate() .

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

php $sdate = "1981-11-04"; . $months = floor(($date_diff - $years * 365*60*60*24) / (30*60*60*24)); $days = floor(($date_diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24)); printf("%d ...