Cách so sánh hai ngày trong php


108

Cách so sánh hai ngày trong php nếu ngày có định dạng '03_01_12''31_12_11'.

Tôi đang sử dụng mã này:

$date1=date('d_m_y');
$date2='31_12_11';
if(strtotime($date1) < strtotime($date2))
   echo '1 is small ='.strtotime($date1).','.$date1;
else
   echo '2 is small ='.strtotime($date2).','.$date2;

Nhưng nó không hoạt động ..



có thể trùng lặp của PHP - So sánh ngày
Wesley Murch

Câu trả lời:


42

Bạn sẽ phải đảm bảo rằng ngày của bạn là đối tượng ngày hợp lệ.

Thử cái này:

$date1=date('d/m/y');
$tempArr=explode('_', '31_12_11');
$date2 = date("d/m/y", mktime(0, 0, 0, $tempArr[1], $tempArr[0], $tempArr[2]));

Sau đó, bạn có thể thực hiện strtotime()phương pháp để nhận được sự khác biệt.


2
Tại sao không str_replace?
self.name 15/09/17

36

Sử dụng DateTime :: createFromFormat :

$format = "d_m_y";
$date1  = \DateTime::createFromFormat($format, "03_01_12");
$date2  = \DateTime::createFromFormat($format, "31_12_11");

var_dump($date1 > $date2);

1
Khi sử dụng d # m # Y, bất kỳ trình phân tách nào được hỗ trợ ;, :, (, ), /, ., ,, -sẽ hoạt động.
Rijk

9

Hàm date_diff () trả về sự khác biệt giữa hai đối tượng DateTime.

Nếu ngày đầu tiên trước ngày thứ hai, số ngày dương sẽ được trả về; nếu không là số ngày âm:

<?php
$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");
?>

sản lượng sẽ là "+272 ngày";

thay đổi $ date1 = "2014-03-15"

 <?php
    $date1=date_create("2014-03-15");
    $date2=date_create("2013-12-12");
    $diff=date_diff($date1,$date2);
    echo $diff->format("%R%a days");
    ?>

Đầu ra sẽ là "-93 ngày"


8
<?php
       $expiry_date = "2017-12-31 00:00:00"
       $today = date('d-m-Y',time()); 
       $exp = date('d-m-Y',strtotime($expiry_date));
       $expDate =  date_create($exp);
       $todayDate = date_create($today);
       $diff =  date_diff($todayDate, $expDate);
       if($diff->format("%R%a")>0){
             echo "active";
       }else{
           echo "inactive";
       }
       echo "Remaining Days ".$diff->format("%R%a days");
?>

Bạn có thể vui lòng thêm một số lời giải thích?
Prafulla Kumar Sahu

8

Không trả lời vấn đề thực tế của OP, mà chỉ trả lời tiêu đề. Vì đây là kết quả hàng đầu để "so sánh ngày tháng trong php".

Khá đơn giản để sử dụng Đối tượng ngày giờ ( php >= 5.3.0) và So sánh chúng trực tiếp

$date1 = new DateTime("2009-10-11");
$date2 = new DateTime("tomorrow"); // Can use date/string just like strtotime.
var_dump($date1 < $date2);

Đối tượng của lớp DateTime không thể chuyển đổi thành chuỗi
Hikaru Shindo

7

Mở rộng câu trả lời của @ nevermind, người ta có thể sử dụng DateTime :: createFromFormat: like,

// use - instead of _. replace _ by - if needed.
$format = "d-m-y";
$date1  = DateTime::createFromFormat($format, date('d-m-y'));
$date2  = DateTime::createFromFormat($format, str_replace("_", "-",$date2));    
var_dump($date1 > $date2);

4

bạn có thể thử một cái gì đó như:

        $date1 = date_create('2014-1-23'); // format of yyyy-mm-dd
        $date2 = date_create('2014-2-3'); // format of yyyy-mm-dd
        $dateDiff = date_diff($date1, $date2);
        var_dump($dateDiff);

Sau đó, bạn có thể truy cập sự khác biệt trong những ngày như sau $ dateDiff-> d;


Chào! cảm ơn, có một chút lỗi đánh máy trong ký tự ']' phải không? nó gần với Phím Enter, tôi cũng phải nhấn nó theo. Cảm ơn vì đã xem xét.
Frederick G. Sandalo

3

Không biết bạn đang gặp vấn đề gì nhưng:

function date_compare($d1, $d2)
{
    $d1 = explode('_', $d1);
    $d2 = explode('_', $d2);

    $d1 = array_reverse($d1);
    $d2 = array_reverse($d2);

    if (strtotime(implode('-', $d1)) > strtotime(implode('-', $d2)))
    {
        return $d2;
    }
    else
    {
        return $d1;
    }
}

3

Thử cái này

$data1 = strtotime(\date("d/m/Y"));
$data1 = date_create($data1);
$data2 = date_create("21/06/2017");

if($data1 < $data2){
    return "The most current date is date1";
}

return "The most current date is date2";


2

Tôi biết điều này là muộn, nhưng để tham khảo trong tương lai, hãy đặt định dạng ngày thành định dạng được công nhận bằng cách sử dụng str_replace thì hàm của bạn sẽ hoạt động. (thay dấu gạch dưới bằng dấu gạch ngang)

//change the format to dashes instead of underscores, then get the timestamp
$date1 = strtotime(str_replace("_", "-",$date1));
$date2 = strtotime(str_replace("_", "-",$date2));

//compare the dates
if($date1 < $date2){
   //convert the date back to underscore format if needed when printing it out.
   echo '1 is small='.$date1.','.date('d_m_y',$date1);
}else{
   echo '2 is small='.$date2.','.date('d_m_y',$date2);
}

2

Bạn có thể chuyển đổi cho số nguyên và so sánh.

Ví dụ.:

$date_1 = date('Ymd');
$date_2 = '31_12_2011';

$date_2 = (int) implode(array_reverse(explode("_", $date_2)));

echo ($date_1 < $date_2) ? '$date_2 is bigger then $date_1' : '$date_2 is smaller than $date_1';

1

Tôi nghĩ đây là một chức năng rất đơn giản

function terminateOrNotStringtoDate($currentDate, $terminationdate)
{
    $crtDate = new DateTime($currentDate);
    $termDate = new DateTime($terminationdate);
    if($crtDate >= $termDate)
    {
        return true;
    } else {
    return false;
    }
}

0

Các bạn, xin đừng làm cho nó phức tạp. Câu trả lời đơn giản dưới đây

$date1=date('d_m_y');
$date2='31_12_11';
$date1=str_replace('_', '-', $date1);
$date2=str_replace('_', '-', $date2)
if(strtotime($date1) < strtotime($date2))
   echo '1 is small ='.strtotime($date1).','.$date1;
else
   echo '2 is small ='.strtotime($date2).','.$date2;

Tôi vừa thêm hai dòng nữa với mã của bạn


-1

Nếu cả hai ngày có cùng định dạng thì hãy sử dụng toán tử so sánh.

$date1 = "2018-05-05"; 
$date2 = "2019-08-19"; 

//comparison operator to  

if ($date1 > $date2) {
    echo "$date1 is latest than $date2"; 
    }
else{
    echo "$date1 is older than $date2"; 
    }

Đầu ra: 2018-05-05 cũ hơn 2019-08-19


Điều này sẽ chỉ hoạt động nếu ngày ở định dạng ISO 8601.
Dharman
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.