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.