PHP'de iki tarihi nasıl karşılaştırabilirim?


125

PHP'de iki tarihi nasıl karşılaştırabilirim?

Tarih, veri tabanında aşağıdaki formatta saklanır

2011/10/02

Hangisinin daha büyük olduğunu görmek için bugünün tarihini veritabanındaki tarihle karşılaştırmak isteseydim, nasıl yapardım?

Bunu denedim

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

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

ama gerçekten bu şekilde çalışmıyor. Bunu yapmanın başka bir yolu nedir?


Db tarihlerini bir DateTime nesnesine atayın ve ardından bu nesneleri karşılaştırın. Stackoverflow.com/questions/961074/…
Peter

Yanıtlar:


80

veri tabanında tarih şu şekilde görünüyor 2011-10-2

YYYY-AA-GG olarak saklayın ve ardından dize karşılaştırması çalışacaktır çünkü "1"> "0" vb.


2
ama ya böyle görünürlerse, 2011-10-02 ve 2012-02-10, ay karşılaştırması için 1> 0, ancak 2011-10-02 <2012-02-10
dav

14
@Davo, karşılaştırma farklı olan ilk karakterde durur. Bu durumda, '1' <'2' nin dördüncü basamağı, böylece beklediğiniz sonucu alırsınız.
Matthew

1
Üzgünüm :), yeterince dikkatli değildim.
dav

aşağıdaki çalışacak 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00mı?
shorif2000

221

Tüm tarihleriniz 1 Ocak 1970'den sonraysa, aşağıdaki gibi bir şey kullanabilirsiniz:

$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 */ }

PHP 5> = 5.2.0 kullanıyorsanız, DateTime sınıfını kullanabilirsiniz:

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

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

Veya bu çizgilerdeki bir şey.


Doğru hatırlıyorsam, endişem 1st of January of 1970yalnızca Windows üzerinde çalışan eski PHP sürümleri için geçerli ve Unix'te hiçbir zaman sorun olmadı.
Álvaro González

Bu cevabı beğendim. Tarihleri ​​strtotime'a () dönüştürmek harika bir seçim
Erich García

2
Şimdi "Tüm tarihleriniz 1 Ocak 1970'den sonra" ve "2038'den önceyse" olmaz mıydı? y2k38 hatası için bizi izleyin. strtotimedaha büyük tarihler için yanlış döndürür. stackoverflow.com/questions/2012589/…
2018

Not DateTimeyöntem tercih edilen bir yöntemdir. Bu nesne her strtotimezamankinden daha fazlasını yapabilir.
Machavity

new DateTime('now')ayrıca bugünün tarihini almaya çalışıyor
Breith

23

Sadece önceden verilen cevapları iltifat etmek için aşağıdaki örneğe bakın:

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



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

Güncelleme: Veya basit kullanım eski okul tarihi () işlevi:

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

1
Tarih bir sınıf / yapıcı değil, bir işlevdir.
spdionis

2
@spdionis yorum için teşekkürler, olası karışıklığı gidermek için Büyük harfini değiştirdim.
d.raev

6

Bunu PHP ile yapmazdım. Bir veritabanı bugünün hangi gün olduğunu bilmelidir. (Örneğin MySQL-> NOW () kullanın), böylece Sorgu içinde karşılaştırmak ve kullanılan Tarih Türlerine bağlı olarak herhangi bir sorun olmadan sonucu döndürmek çok kolay olacaktır.

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

teşekkürler ama aslında tarih () kullanıyorum bugünün tarihini bir db
Sarmen B'de saklamıyorum.

4
Ancak expireDate'i bir db'de saklarsınız. Bu tarihi ŞİMDİ ile karşılaştırın ()
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

İşte iki tarih arasındaki farkı dakikalar içinde nasıl elde edeceğinizin bir yolu .

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

Soru, 2 tarihin karşılaştırılmasını istiyor - cevabınız, soruya cevap olarak gerekli olmayan bir sürü ekstra şey eklemektir (yani çevrimiçi / çevrimdışı durumu ayarlamak). Karşılaştırma yerleri alır Cevabınız parçası neredeyse zaten mevcut yanıtlardan aynıdır burada .
crazyloonybin

Soruyu güncelledim, yanlış soruya yanlış cevabı gönderdim ^^;) Cevapla aynı değil, sadece onları nasıl karşılaştıracağıma ve farkı dakikalar içinde elde edeceğime dair girdimi ekledim.
Syno

1
Güncellemeniz nedeniyle olumsuz oyumu kaldırdım, şimdi çok daha iyi görünüyor :)
crazyloonybin

2

Tarihleri ​​UNIX zaman damgalarına dönüştürebilir ve aralarındaki farkı saniye cinsinden karşılaştırabilirsiniz.

$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

Ben de bu sorunu yaşadım ve şu şekilde çözerim:

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

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

Cevapta bu tekniğin neden işe yaradığı açıklanmalıdır.
mickmackusa

Lütfen kendi benzersiz senaryonuzu nasıl çözdüğünüzü değil, OP'nin yayınladığı soruyu yanıtlayın.
mickmackusa

0

İşte PHP ile iki tarih arasındaki gün farkını nasıl elde edeceğime dair yorumum. '!' Kullanımına dikkat edin. DateTime createFromFormat'taki bilgiler sayesinde tarihlerin saat bölümünü atmak için formatta .

$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

Cevabı bir blogda buldum ve bu kadar basit:

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

Ve 2 tarih arasındaki günleri alacaksınız.


Bu, farklı bir sorunu çözüyor gibi görünüyor. Lütfen yalnızca OP tarafından sorulan soruyu yanıtlayın.
mickmackusa

-1

Bu, PHP'nin dize karşılaştırma mantığı nedeniyle çalışır. Basitçe kontrol edebilirsiniz ...

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

Her iki tarih de aynı formatta olmalıdır. Rakamların sola sıfır olarak doldurulması ve en önemliden en az anlamlıya doğru sıralanması gerekir. Y-m-dve Y-m-d H:i:sbu koşulları yerine getirin.


1
d-m-Yçalışmayacak .. Y-m-d(2016-05-08 gibi başında sıfır ile) çalışacaktır. Bu tarihleri d-m-Yformatta kontrol edin 01-10-2016ve 20-02-20160 <2 dizeleri olarak karşılaştırırsanız, karşılaştırmayı durdurur ama yanlış ...
Arxeiss

: İşte tekniği doğru bugünün tarihine karşı OP'ın tarihleri karşılaştırmak için başarısız olacak kanıtıdır 3v4l.org/SNHKT
mickmackusa

OP'nin farklı bir tarih biçimi vardır. tarih görünüyor 2011-10-2.
mickmackusa

-1

Bir tarihin ($ tarih) belirli bir aralıkta süresinin dolmasını istiyorsanız, örneğin bir parola sıfırlama gerçekleştirirken bir belirteç son kullanma tarihi, şu şekilde yapabilirsiniz:

$date = $row->expireDate;

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

$now = new \DateTime();

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

Ancak sizin durumunuzda, karşılaştırmayı aşağıdaki gibi yapabilirsiniz:

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

$date = $row->expireDate;

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

Bu cevap, orijinal olarak gönderilen soruyu görmezden geliyor. Lütfen OP tarafından sağlanan örnek verileri kullanın.
mickmackusa

Adamın yardım istediği tam olarak bu değil ama ilkeleri anlarsa bu yolun yardımcı olabileceğini düşündüm.
faye.babacar78

Prensipleri anlıyorum ama bu kod sorulan soruya cevap vermiyor. Bu sayfa zaten yanlış ve ilgisiz cevaplarla şişirilmiş durumda - bu sadece araştırmacıların kafasını karıştırıyor ve zamanlarını boşa harcıyor. Araştırmacılara göz kulak olmaya çalışıyorum.
mickmackusa

Sanırım o kadar da zor değil, date () işlevi yerine DateTime () sınıfını kullanabilirdi. Yukarıda verdiğim cevap, bir şekilde araştırmacılara fikir vermektir.
faye.babacar78

1
Kendimi tekrar etmekten vazgeçeceğim ve bu tartışmadan ayrılacağım. En yüksek ikinci çözüm ( stackoverflow.com/a/3847762/2943403 ), iki datetime nesnesi oluşturmanın korkunç derecede basit (rakipsiz) bir yolunu gösterir. Büyü requestDate()yönteminizin ne yaptığı hakkında kesinlikle hiçbir fikrim yok - bundan hiçbir yerde bahsedilmiyor. Cevabınızı kullanmam, herhangi bir araştırmacının çözümünüzü kullanmasını tavsiye etmem. Oyumu değiştireceğimi düşünmüyorum.
mickmackusa

-2

her şeyden önce, istediğiniz formatı sunucunuzun geçerli tarih saatine vermeye çalışın:

  1. Geçerli tarih saatini alın

    $ geçerli_tarih = getdate ();

  2. Bunları istediğiniz gibi yönetmek için ayrı tarih ve saat:

$ current_date_only = $ current_date [year] .'- '. $ cari_date [mon] .'-'. $ cari_tarih [gün]; $ current_time_only = $ current_date ['saat']. ':'. $ geçerli_tarih ['dakika']. ':'. $ geçerli_tarih ['saniye'];

  1. Veritabanınızda donly date veya datetime kullanıp kullanmadığınıza bağlı olarak karşılaştırın:

    $ bugün = $ current_date_only. ' ' Current_time_only $.;

    veya

    $ bugün = $ current_date_only;

    eğer ($ bugün <$ expireDate)

Umarım yardımcı olur


Bu cevap, orijinal soruyu çözmek için hiçbir girişimde bulunmaz. OP'nin saat, dakika veya saniye ile ilgisi yoktur.
mickmackusa
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.