So sánh ngày đã cho với ngày hôm nay


216

Tôi đã theo dõi

$var = "2010-01-21 00:00:00.0"

Tôi muốn so sánh ngày này với ngày hôm nay (tức là tôi muốn biết liệu đây $varcó phải là trước ngày hôm nay hay bằng ngày hôm nay hay không)

Tôi cần sử dụng chức năng gì?


5
Tôi cũng đề nghị đặt múi giờ nữa
NJInamdar

Câu trả lời:


289
strtotime($var);

Biến nó thành một giá trị thời gian

time() - strtotime($var);

Cung cấp cho bạn những giây kể từ khi $var

if((time()-(60*60*24)) < strtotime($var))

Sẽ kiểm tra nếu $varđã được trong ngày cuối cùng.


1
đối với php 4, thoát '.0' cuối cùng từ $ var = "2010-01-21 00: 00: 00.0", nếu không, strtotime sẽ trả về -1
vivoconunxino

1
Tôi đang sử dụng PHP 7.1. Phần thứ hai chỉ bị bỏ qua, trả về là một số nguyên với số giây.
Diogo Melo

208

Định dạng đó là hoàn toàn phù hợp để so sánh chuỗi tiêu chuẩn, ví dụ

if ($date1 > $date2){
  //Action
}

Để có được ngày hôm nay trong định dạng đó, chỉ cần sử dụng : date("Y-m-d H:i:s").

Vì thế:

$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";

if ($date < $today) {}

Đó là vẻ đẹp của định dạng đó: nó đặt hàng độc đáo. Tất nhiên, điều đó thể kém hiệu quả hơn, tùy thuộc vào hoàn cảnh chính xác của bạn, nhưng nó cũng có thể thuận tiện hơn rất nhiều và dẫn đến mã dễ bảo trì hơn - chúng ta cần biết nhiều hơn để thực hiện cuộc gọi phán xét đó.

Đối với múi giờ chính xác, bạn có thể sử dụng, ví dụ:

date_default_timezone_set('America/New_York');

Nhấn vào đây để tham khảo các múi giờ PHP có sẵn.


2
Điều này cũng bỏ qua múi giờ
anushr

@anushr, nếu cần múi giờ so sánh, chênh lệch thời gian có thể được thêm vào ngày trước khi so sánh. Điều này vẫn nhanh hơn so với việc cố gắng chuyển đổi hai chuỗi thời gian ngày ở mm/dd/yyyyđịnh dạng thành ngày và sau đó so sánh nó. Nó luôn làm tôi lo lắng khi các nhà phát triển có ngày ở nhiều múi giờ trong hệ thống của họ. Tôi nghĩ sẽ tốt hơn nếu lưu trữ ngày trong hệ thống của bạn, luôn ở múi giờ đơn và sau đó hiển thị nó theo bất kỳ múi giờ nào. Tôi bắt đầu sử dụng yyyy-mm-ddđịnh dạng (hoặc yyyymmdd) vào khoảng năm 1998 khi tôi nhận ra nó sắp xếp nhanh hơn rất nhiều ngay cả trong máy chủ SQL.
AaA

59

Ở đây bạn đi:

function isToday($time) // midnight second
{
    return (strtotime($time) === strtotime('today'));
}

isToday('2010-01-22 00:00:00.0'); // true

Ngoài ra, một số chức năng trợ giúp khác:

function isPast($time)
{
    return (strtotime($time) < time());
}

function isFuture($time)
{
    return (strtotime($time) > time());
}

Tại sao logic ngược lạ và booleans ngoại lai? Tại sao không chỉ là "return strtotime ($ time) == strtotime ('today')", "return strtotime ($ time)> time ()" và "return strtotime ($ time) <time ()"?
Bobby Jack

@Bulk Jack: Tôi có nhiều chức năng hơn trong các chức năng đó, quên xóa mã bổ sung. Đã sửa bây giờ.
Alix Axel

+1 trên chức năng của trình trợ giúp, cụ thể là isPast b / c Tôi vừa chạy a if(strtotime('2013-01-22 00:00:00.00') < time()){....}và điều đó đã giúp tôi.
MDMoore313

47

Để hoàn thành BoBby Jack, sử dụng OBject DateTime, nếu bạn có php 5.2.2+:

if(new DateTime() > new DateTime($var)){
    // $var is before today so use it

}

Điều này LAF không đúng. Nếu $ var là ngày hiện tại (sau nửa đêm chính xác), DateTime () mới sẽ lớn hơn DateTime mới ($ var) và không đúng $ var trước ngày hôm nay.
dxvargas

46

Bạn có thể sử dụng DateTimelớp:

$past   = new DateTime("2010-01-01 00:00:00");
$now    = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");

Toán tử so sánh hoạt động *:

var_dump($past   < $now);         // bool(true)
var_dump($future < $now);         // bool(false)

var_dump($now == $past);          // bool(false)
var_dump($now == new DateTime()); // bool(true)
var_dump($now == $future);        // bool(false)

var_dump($past   > $now);         // bool(false)
var_dump($future > $now);         // bool(true)

Cũng có thể lấy các giá trị dấu thời gian từ các đối tượng DateTime và so sánh chúng:

var_dump($past  ->getTimestamp());                        // int(1262286000)
var_dump($now   ->getTimestamp());                        // int(1431686228)
var_dump($future->getTimestamp());                        // int(1577818800)
var_dump($past  ->getTimestamp() < $now->getTimestamp()); // bool(true)
var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)

* Lưu ý rằng ===trả về false khi so sánh hai đối tượng DateTime khác nhau ngay cả khi chúng đại diện cho cùng một ngày.


$futuređã trở thành quá khứ. : P
mbomb007

Ôi, thời gian trôi nhanh làm sao.
Salman A

13
$toBeComparedDate = '2014-08-12';
$today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
$expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');

var_dump(strtotime($today) > strtotime($expiry)); //false or true

đó không phải là những gì tôi $varbằng trong OP
alexus

1
Và bạn cần PHP> = 5,4 cho (định dạng DateTime ()) -> mới ('Ym-d');
webrama.pl 18/03/2015

6

Một lưu ý dựa trên kinh nghiệm của tôi, nếu mục đích của bạn chỉ liên quan đến ngày thì hãy cẩn thận để bao gồm dấu thời gian . Ví dụ, nói hôm nay là "2016-11-09". So sánh liên quan đến dấu thời gian sẽ vô hiệu hóa logic ở đây. Thí dụ,

//  input
$var = "2016-11-09 00:00:00.0";

//  check if date is today or in the future
if ( time() <= strtotime($var) ) 
{
    //  This seems right, but if it's ONLY date you are after
    //  then the code might treat $var as past depending on
    //  the time.
}

Mã ở trên có vẻ đúng, nhưng nếu CHỈ là ngày bạn muốn so sánh, thì mã ở trên không phải là logic đúng. Tại sao? Bởi vì, time () và strtotime () sẽ cung cấp bao gồm dấu thời gian. Đó là, mặc dù cả hai ngày rơi vào cùng một ngày, nhưng sự khác biệt về thời gian sẽ có vấn đề. Hãy xem xét ví dụ dưới đây:

//  plain date string
$input = "2016-11-09";

Bởi vì đầu vào là chuỗi ngày đơn giản, sử dụng strtotime()vào $inputsẽ cho rằng đó là nửa đêm của ngày 2016-11-09. Vì vậy, chạy time()bất cứ lúc nào sau nửa đêm sẽ luôn coi $inputlà quá khứ, mặc dù chúng ở cùng một ngày.

Để sửa lỗi này, bạn có thể chỉ cần mã, như thế này:

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}

1
Tôi chắc chắn OP đã xem xét điều này và đó là lý do tại sao họ bao gồm `00: 00: 00.0 'trong câu hỏi của họ
AaA

6

Vài năm sau, tôi quan sát lần thứ hai của Bobby Jack rằng 24 giờ qua không phải là hôm nay !!! Và tôi ngạc nhiên rằng câu trả lời đã được đưa ra rất nhiều ...

Để so sánh nếu một ngày nhất định là ít hơn, bằng hoặc lớn hơn một ngày khác, trước tiên bạn cần phải biến chúng "xuống" thành đầu ngày. Nói cách khác, đảm bảo rằng bạn đang nói về cùng một thời gian 00:00:00 trong cả hai ngày. Điều này có thể được thực hiện đơn giản và thanh lịch như:

strtotime("today") <=> strtotime($var)

nếu $varcó phần thời gian vào 00:00:00 như OP đã chỉ định.

Thay thế <=>bằng bất cứ thứ gì bạn cần (hoặc giữ nó như thế này trong php 7)

Ngoài ra, rõ ràng, chúng ta đang nói về cùng múi giờ cho cả hai. Để biết danh sách các múi giờ được hỗ trợ


5
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);

(ví dụ w3schools, nó hoạt động hoàn hảo)


4

Mở rộng câu trả lời của Josua từ w3schools:

//create objects for the dates to compare
$date1=date_create($someDate);
$date2=date_create(date("Y-m-d"));
$diff=date_diff($date1,$date2);
//now convert the $diff object to type integer
$intDiff = $diff->format("%R%a");
$intDiff = intval($intDiff);
//now compare the two dates
if ($intDiff > 0)  {echo '$date1 is in the past';}
else {echo 'date1 is today or in the future';}

Tôi hi vọng cái này giúp được. Bài viết đầu tiên của tôi trên stackoverflow!


1

So sánh các đối tượng thời gian ngày:

(Tôi đã chọn 10 ngày - Mọi thứ cũ hơn 10 ngày là "OLD", khác "MỚI")

$now   = new DateTime();
$diff=date_diff($yourdate,$now);
$diff_days = $diff->format("%a");
if($diff_days > 10){
    echo "OLD! " . $yourdate->format('m/d/Y');
}else{
    echo "NEW! " . $yourdate->format('m/d/Y');
}

1

Một số câu trả lời không được xem xét trong ngày hiện tại!

Đây là đề xuất của tôi.

$var = "2010-01-21 00:00:00.0"
$given_date = new \DateTime($var);

if ($given_date == new \DateTime('today')) {
  //today
}

if ($given_date < new \DateTime('today')) {
  //past
}

if ($given_date > new \DateTime('today')) {
  //future
}

0

Nếu bạn làm mọi việc với thời gian và ngày tháng, Carbon là người bạn tốt nhất của bạn;

Cài đặt gói sau đó:

$theDay = Carbon::make("2010-01-21 00:00:00.0");

$theDay->isToday();
$theDay->isPast();
$theDay->isFuture();
if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))

lt = ít hơn, gt = lớn hơn

Như trong câu hỏi:

$theDay->gt(Carbon::today()) ? true : false;

và nhiều hơn nữa;

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.