Làm thế nào tôi có thể so sánh hai ngày trong PHP?


125

Làm thế nào tôi có thể so sánh hai ngày trong PHP?

Ngày được lưu trữ trong cơ sở dữ liệu theo định dạng sau

2011-10-2

Nếu tôi muốn so sánh ngày hôm nay với ngày trong cơ sở dữ liệu để xem cái nào lớn hơn, tôi sẽ làm thế nào?

Tôi đã thử nó

$today = date("Y-m-d");
$expire = $row->expireDate //from db

if($today < $expireDate) { //do something; }

nhưng nó không thực sự hoạt động theo cách đó. Cách nào khác để làm điều đó?


Gán ngày db cho một đối tượng DateTime và sau đó so sánh các đối tượng đó. Bạn có thể tìm thấy một ví dụ hay trong stackoverflow.com/questions/961074/ mẹo
Peter

Câu trả lời:


80

trong cơ sở dữ liệu ngày tháng trông như thế này 2011-10-2

Lưu trữ nó trong YYYY-MM-DD và sau đó so sánh chuỗi sẽ hoạt động vì '1'> '0', v.v.


2
nhưng điều gì sẽ xảy ra nếu chúng trông như thế này,
2011-10 /

14
@Davo, sự so sánh dừng lại ở ký tự đầu tiên khác. Trong trường hợp này, chữ số thứ tư của '1' <'2', vì vậy bạn nhận được kết quả mà bạn mong đợi.
Matthew

1
Tôi xin lỗi :), đã không đủ cẩn thận.
dav

sẽ làm việc sau đây 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00?
shorif2000

221

Nếu tất cả các ngày của bạn là sau ngày 1 tháng 1 năm 1970, bạn có thể sử dụng một cái gì đó như:

$today = date("Y-m-d");
$expire = $row->expireDate; //from database

$today_time = strtotime($today);
$expire_time = strtotime($expire);

if ($expire_time < $today_time) { /* do Something */ }

Nếu bạn đang sử dụng PHP 5> = 5.2.0, bạn có thể sử dụng lớp DateTime:

$today_dt = new DateTime($today);
$expire_dt = new DateTime($expire);

if ($expire_dt < $today_dt) { /* Do something */ }

Hoặc một cái gì đó dọc theo những dòng này.


Nếu tôi nhớ lại một cách chính xác, mối quan tâm về việc 1st of January of 1970chỉ áp dụng cho các phiên bản PHP cũ chạy trên Windows và nó không bao giờ là vấn đề trên Unix.
Álvaro González

Tôi thích câu trả lời này. Đó là một sự lựa chọn tuyệt vời chuyển đổi ngày thành strtotime ()
Erich García

2
Bây giờ không phải là "Nếu tất cả các ngày của bạn là sau ngày 1 tháng 1 năm 1970" và "trước năm 2038"? xem của chúng tôi cho các lỗi y2k38. strtotimesẽ trả về false cho ngày lớn hơn. stackoverflow.com/questions/2012589/
hy

Lưu ý rằng DateTimephương pháp là phương pháp ưa thích. Đối tượng đó có thể làm nhiều hơn strtotimebao giờ hết.
Machavity

new DateTime('now')cũng hoạt động để lấy lại ngày hôm nay
Breith

23

Chỉ để khen những câu trả lời đã được đưa ra, xem ví dụ sau:

$today = new DateTime('');
$expireDate = new DateTime($row->expireDate); //from database



if($today->format("Y-m-d") < $expireDate->format("Y-m-d")) { 
    //do something; 
}

Cập nhật: Hoặc đơn giản sử dụng hàm date -school old () :

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   

1
Ngày là một hàm, không phải là lớp / hàm tạo.
spdionis

2
@spdionis cảm ơn vì nhận xét, tôi đã thay đổi chữ in hoa để loại bỏ sự nhầm lẫn có thể.
d.raev

6

Tôi sẽ không làm điều này với PHP. Cơ sở dữ liệu nên biết, hôm nay là ngày gì (ví dụ: sử dụng MySQL-> NOW ()), do đó sẽ rất dễ dàng để so sánh trong Truy vấn và trả về kết quả, mà không có bất kỳ vấn đề nào tùy thuộc vào Loại ngày được sử dụng

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName

cảm ơn nhưng tôi thực sự sử dụng date () tôi không lưu trữ ngày hôm nay trong một db
Sarmen B.

4
Nhưng bạn lưu trữ expireDate trong một db. So sánh ngày này với NOW ()
Dr.Molle

4
$today = date('Y-m-d');//Y-m-d H:i:s
$expireDate = new DateTime($row->expireDate);// From db 
$date1=date_create($today);
$date2=date_create($expireDate->format('Y-m-d'));
$diff=date_diff($date1,$date2);

//echo $timeDiff;
if($diff->days >= 30){
    echo "Expired.";
}else{
    echo "Not expired.";
}

2

Đây là một cách để có được sự khác biệt giữa hai ngày trong vài phút.

// set dates
$date_compare1= date("d-m-Y h:i:s a", strtotime($date1));
// date now
$date_compare2= date("d-m-Y h:i:s a", strtotime($date2));

// calculate the difference
$difference = strtotime($date_compare1) - strtotime($date_compare2);
$difference_in_minutes = $difference / 60;

echo $difference_in_minutes;

Câu hỏi đang yêu cầu so sánh 2 ngày - câu trả lời của bạn là thêm một lượng nội dung bổ sung (nghĩa là đặt trạng thái trực tuyến / ngoại tuyến) không cần thiết như một câu trả lời cho câu hỏi. Phần câu trả lời của bạn trong đó việc so sánh diễn ra gần giống như câu trả lời đã có ở đây .
crazyloonybin

Cập nhật câu hỏi, tôi đã đăng câu trả lời sai trong câu hỏi sai ^^;) Nó không giống như câu trả lời, chỉ cần thêm ý kiến ​​của tôi về cách so sánh chúng và nhận được sự khác biệt trong vài phút.
Syno

1
Tôi đã xóa downvote của tôi vì bản cập nhật của bạn, bây giờ trông khá hơn nhiều :)
crazyloonybin

2

Bạn có thể chuyển đổi ngày thành dấu thời gian UNIX và so sánh sự khác biệt giữa chúng trong vài giây.

$today_date=date("Y-m-d");
$entered_date=$_POST['date'];
$dateTimestamp1 = strtotime($today_date);
$dateTimestamp2 = strtotime($entered_date);
$diff= $dateTimestamp1-$dateTimestamp2;
//echo $diff;
if ($diff<=0)
   {
     echo "Enter a valid date";
   }

0

Tôi cũng có vấn đề đó và tôi giải quyết nó bằng cách:

$today = date("Ymd");
$expire = str_replace('-', '', $row->expireDate); //from db

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}

Tại sao kỹ thuật này hoạt động nên được giải thích trong câu trả lời.
mickmackusa

Vui lòng trả lời câu hỏi đã đăng của OP, không phải cách bạn giải quyết tình huống độc đáo của riêng bạn.
mickmackusa

0

Đây là guồng quay của tôi về cách có được sự khác biệt về số ngày giữa hai ngày với PHP. Lưu ý việc sử dụng '!' trong định dạng để loại bỏ phần thời gian của ngày, nhờ thông tin từ DateTime createdFromFormat mà không có thời gian .

$today = DateTime::createFromFormat('!Y-m-d', date('Y-m-d'));
$wanted = DateTime::createFromFormat('!d-m-Y', $row["WANTED_DELIVERY_DATE"]);
$diff = $today->diff($wanted);
$days = $diff->days;
if (($diff->invert) != 0) $days = -1 * $days;
$overdue = (($days < 0) ? true : false);
print "<!-- (".(($days > 0) ? '+' : '').($days).") -->\n";

-1

Tìm thấy câu trả lời trên một blog và nó đơn giản như:

strtotime(date("Y"."-01-01")) -strtotime($newdate))/86400

Và bạn sẽ có được những ngày giữa 2 ngày.


Điều này dường như đang giải quyết một vấn đề khác. Xin vui lòng chỉ trả lời câu hỏi của OP.
mickmackusa

-1

Điều này hoạt động vì logic so sánh chuỗi của PHP. Đơn giản là bạn có thể kiểm tra ...

if ($startdate < $date) {// do something} 
if ($startdate > $date) {// do something}

Cả hai ngày phải ở cùng một định dạng. Các chữ số cần được đệm bằng 0 ở bên trái và được sắp xếp theo thứ tự từ quan trọng nhất đến ít quan trọng nhất. Y-m-dY-m-d H:i:sthỏa mãn những điều kiện này.


1
d-m-Ysẽ không hoạt động .. Y-m-d(với số 0 hàng đầu như 2016-05-08) sẽ hoạt động. Kiểm tra những ngày đó ở d-m-Yđịnh dạng 01-10-201620-02-2016, so sánh dưới dạng chuỗi 0 <2, nó sẽ dừng so sánh nhưng không chính xác ...
Arxeiss

Dưới đây là bằng chứng cho thấy kỹ thuật của bạn sẽ không so sánh chính xác ngày của OP với ngày hôm nay: 3v4l.org/SNHKT
mickmackusa

OP có định dạng ngày khác nhau. ngày trông giống như 2011-10-2.
mickmackusa

-1

Nếu bạn muốn một ngày ($ date) hết hạn trong một khoảng thời gian, ví dụ như ngày hết hạn mã thông báo khi thực hiện đặt lại mật khẩu, đây là cách bạn có thể làm:

$date = $row->expireDate;

$date->add(new DateInterval('PT24H')); // adds 24 hours

$now = new \DateTime();

if($now < $date) { /* expired after 24 hours */ }

Nhưng trong trường hợp của bạn, bạn có thể thực hiện so sánh như sau:

$today = new DateTime('Y-m-d');

$date = $row->expireDate;

if($today < $date) { /* do something */ }

Câu trả lời này là bỏ qua các câu hỏi được đăng ban đầu. Vui lòng sử dụng dữ liệu mẫu do OP cung cấp.
mickmackusa

Đó không phải là chính xác những gì anh chàng đang yêu cầu giúp đỡ nhưng tôi nghĩ cách này có thể giúp nếu một người hiểu các nguyên tắc.
faye.babacar78

Tôi hiểu các nguyên tắc, nhưng mã này không trả lời câu hỏi được hỏi. Trang này đã đầy ắp những câu trả lời không chính xác và không liên quan - điều này chỉ khiến các nhà nghiên cứu bối rối và lãng phí thời gian của họ. Tôi đang cố gắng để ý các nhà nghiên cứu.
mickmackusa

Chà, tôi nghĩ nó không khó lắm, anh ta có thể đã sử dụng lớp DateTime () thay vì hàm date (). Câu trả lời tôi đặt ở trên là bằng cách nào đó để đưa ra ý tưởng cho các nhà nghiên cứu.
faye.babacar78

1
Tôi sẽ ngừng lặp lại chính mình và từ bỏ cuộc thảo luận này. Giải pháp cao thứ 2 ( stackoverflow.com/a/3847762/2943403 ) cho thấy một cách đơn giản khủng khiếp (không thể đánh bại) để tạo hai đối tượng datetime. Tôi hoàn toàn không biết requestDate()phương pháp ma thuật của bạn làm gì - không có đề cập đến nó ở bất cứ đâu. Tôi sẽ không sử dụng câu trả lời của bạn, cũng như không khuyến nghị bất kỳ nhà nghiên cứu nào sử dụng giải pháp của bạn. Tôi không thấy mình thay đổi phiếu bầu của mình.
mickmackusa

-2

trước hết, hãy thử đưa ra định dạng bạn muốn cho thời gian ngày hiện tại của máy chủ của bạn:

  1. Có được thời gian ngày hiện tại

    $ current_date = getdate ();

  2. Ngày và giờ riêng biệt để quản lý chúng theo ý muốn:

$ current_date_only = $ current_date [năm] .'- '. $ current_date [mon] .'-'. $ current_date [mday]; $ current_time_only = $ current_date ['hours']. ':'. $ current_date ['phút']. ':'. $ current_date ['giây'];

  1. So sánh nó tùy thuộc vào việc bạn đang sử dụng donly date hay datetime trong DB của bạn:

    $ hôm nay = $ current_date_only. ' '. $ current_time_only;

    hoặc là

    $ hôm nay = $ current_date_only;

    if ($ hôm nay <$ expireDate)

hy vọng nó giúp


Câu trả lời này làm cho không có nỗ lực để giải quyết câu hỏi ban đầu. OP không quan tâm đến giờ, phút hoặc giây.
mickmackusa
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.