Verilen tarihi bugünle karşılaştır


216

Takip ettim

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

Bu tarihi bugünün tarihiyle karşılaştırmak istiyorum (yani bunun $varbugünden önce mi yoksa bugüne mi eşit olduğunu bilmek istiyorum )

Hangi işlevi kullanmam gerekir?


5
Saat dilimini de ayarlamanızı öneririm
NJInamdar

Yanıtlar:


289
strtotime($var);

Zaman değerine dönüştürür

time() - strtotime($var);

O zamandan beri saniyeler verir $var

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

$varSon gün içinde olup olmadığını kontrol eder .


1
php 4 için $ var = "2010-01-21 00: 00: 00.0" dan son '.0' çıkın, aksi takdirde strtotime -1 döndürür -1
vivoconunxino

1
PHP 7.1 kullanıyorum. Dönüş saniye cinsinden bir tamsayı olduğu için sonraki ikinci bölüm yok sayılır.
Diogo Melo

209

Bu biçim, standart bir dize karşılaştırması için mükemmel şekilde uygundur.

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

Bu biçimde bugünün tarihi almak için sadece kullanın: date("Y-m-d H:i:s").

Yani:

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

if ($date < $today) {}

Bu formatın güzelliği bu: güzel bir şekilde sipariş ediyor. Tabii ki olabilir tam koşullara bağlı olarak çok verimli olmayabilir, ama aynı zamanda bir sürü daha uygun ve daha sürdürülebilir koda sebep olabilir - daha gerçekten bilmek o yargı çağrı yapmak gerekiyordu.

Doğru saat dilimi için, örneğin,

date_default_timezone_set('America/New_York');

Kullanılabilir PHP Zaman Dilimlerine başvurmak için burayı tıklayın .


2
Bu da zaman dilimini yok sayar
anushr

@anushr, eğer karşılaştırmada zaman dilimi gerekiyorsa, karşılaştırmadan önce tarihe zaman farkı eklenebilir. Bu hala iki tarih saat dizesini mm/dd/yyyybiçim olarak tarihe dönüştürmeye ve sonra karşılaştırmaya çalışmaktan daha hızlıdır . Geliştiricilerin sistemlerinde birden fazla saat diliminde tarihleri ​​olduğunda her zaman endişeleniyorum. Tarihleri ​​sisteminizde saklamak, her zaman tek bir saat diliminde saklamak ve daha sonra gereken saat diliminde görüntülemek daha iyidir. SQL sunucusunda bile çok daha hızlı olduğunu fark ettiğimde 1998 yyyy-mm-dd(veya yyyymmdd) biçimini kullanmaya başladım .
AaA

59

Hadi bakalım:

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

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

Ayrıca, bazı daha yardımcı işlevler:

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

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

Neden garip geriye doğru mantık ve yabancı boolelar? Neden yalnızca "dönüş strtotime ($ time) == strtotime ('bugün')", "return strtotime ($ time)> time ()" ve "return strtotime ($ time) <time ()" değil?
Bobby Jack

@Bobby Jack: Bu işlevlerde daha fazla işlevsellik vardı, ekstra kodu silmeyi unuttum. Şimdi düzeltildi.
Alix Axel

+1 yardımcı işlevi, özellikle isPast b / c Ben sadece bir koştu if(strtotime('2013-01-22 00:00:00.00') < time()){....}ve bu benim için yaptı.
MDMoore313

47

Php 5.2.2+ sürümüne sahipseniz, BoBby Jack'i kullanmak için DateTime OBject kullanımı:

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

}

Bu doğru değil. $ Var geçerli gündeyse (tam gece yarısından sonra), yeni DateTime () yeni DateTime'dan ($ var) daha büyük olacaktır ve bu doğru değildir $ var bugünden önce.
dxvargas

46

DateTimeSınıfı kullanabilirsiniz :

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

Karşılaştırma operatörleri çalışır *:

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)

DateTime nesnelerinden zaman damgası değerlerini almak ve bunları karşılaştırmak da mümkündür:

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)

* ===İki farklı DateTime nesnesini aynı tarihi temsil etseler bile karşılaştırırken false döndürdüğünü unutmayın .


$futuregeçmiş haline geldi. : P
mbomb007

Benim, zaman nasıl uçar.
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

Bu benim $varOP de eşit değil
alexus

1
Ve (yeni DateTime ()) -> biçimi ('Ym-d') için PHP> = 5.4'e ihtiyacınız var;
webrama.pl

6

Deneyimlerime dayalı bir dikkat, eğer amacınız sadece tarih içeriyorsa, zaman damgasını eklemeye dikkat edin . Örneğin, bugün diyelim "2016-11-09". Zaman damgasını içeren karşılaştırma burada mantığı geçersiz kılacaktır. Misal,

//  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.
}

Yukarıdaki kod doğru görünüyor, ancak SADECE karşılaştırmak istediğiniz tarihse, yukarıdaki kod doğru mantık değildir. Neden? Çünkü time () ve strtotime (), zaman damgasını içerecektir. Yani, her iki tarih de aynı güne düşse de, zaman farkı önemli olacaktır. Aşağıdaki örneği düşünün:

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

Girişi düz tarih dizesi olduğundan, kullanırken strtotime()üzerinde $inputo 2016-11-09 gece yarısı olduğunu varsayar. Yani, time()gece yarısından sonra herhangi bir zamanda koşmak $input, aynı gün olsalar bile , her zaman geçmiş gibi davranacaktır .

Bunu düzeltmek için basitçe şöyle kodlayabilirsiniz:

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

1
Eminim OP bunu düşündü ve bu yüzden sorularına `` 00: 00: 00.0 '' da dahil ettiler
AaA

6

Birkaç yıl sonra, Bobby Jack'in son 24 saatin bugün olmadığı gözlemini ikinci kez aldım !!! Ve cevabın o kadar çok iptal edildiğine şaşırdım ...

Belirli bir tarihin diğerinden daha az, eşit veya daha büyük olup olmadığını karşılaştırmak için, önce günün başlangıcına "aşağı" döndürmeniz gerekir. Başka bir deyişle, her iki tarihte de aynı 00:00:00 saatinde konuştuğunuzdan emin olun. Bu basit ve zarif bir şekilde yapılabilir:

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

Eğer $varzaman parçası 00:00:00 OP belirtilen gibi .

<=>İhtiyacınız olanla değiştirin (veya php 7'de böyle tutun)

Ayrıca, her ikisi için de aynı saat dilimi hakkında konuşuyoruz. İçin Dilimlerinin Listesi


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

(w3schools örneği, mükemmel çalışıyor)


4

Josua'nın w3schools'un cevabına genişleyen:

//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';}

Umarım bu yardımcı olur. Stackoverflow'daki ilk yazım!


1

Tarih ve saat nesnelerini karşılaştırın:

(10 gün seçtim - 10 günden daha eski herhangi bir şey "ESKİ", başka bir şekilde "YENİ")

$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

Verilen cevapların bazıları günümüzde dikkate alınmamıştır!

İşte teklifim.

$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

Eğer zaman ve tarih ile bir şeyler yaparsanız Karbon en iyi arkadaşınızdır;

Paketi kurun ve ardından:

$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 = küçüktür, gt = büyüktür

Sorudaki gibi:

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

ve daha fazlası;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.