Jak mogę porównać dwie daty w PHP?


125

Jak mogę porównać dwie daty w PHP?

Data jest przechowywana w bazie danych w następującym formacie

2011-10-2

Gdybym chciał porównać dzisiejszą datę z datą w bazie danych, aby zobaczyć, która z nich jest większa, jak mam to zrobić?

Próbowałem tego,

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

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

ale tak naprawdę to nie działa. Jaki jest inny sposób na zrobienie tego?


Przypisz daty db do obiektu DateTime, a następnie porównaj te obiekty. Możesz znaleźć fajny przykład na stackoverflow.com/questions/961074/ ...
— Peter

Odpowiedzi:


80

w bazie danych data wygląda następująco: 2011-10-2

Zapisz go w formacie RRRR-MM-DD, a wtedy porównanie ciągów zadziała, ponieważ „1”> „0” itd.


2
ale co jeśli wyglądają tak, 2011-10-02 i 2012-02-10, dla porównania miesięcznego 1> 0, ale 2011-10-02 <2012-02-10
— dav

14
@Davo, porównanie kończy się na pierwszym innym znaku. W tym przypadku czwarta cyfra „1” <„2”, więc otrzymasz oczekiwany wynik.
— Matthew,

1
Przepraszam :), nie był wystarczająco ostrożny.
— dav

czy poniższe zadziała 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00?
— shorif2000

221

Jeśli wszystkie twoje daty są późniejsze niż 1 stycznia 1970, możesz użyć czegoś takiego:

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

Jeśli używasz PHP 5> = 5.2.0, możesz użyć klasy DateTime:

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

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

Albo coś w tym stylu.


O ile dobrze pamiętam, obawa 1st of January of 1970dotyczy tylko starszych wersji PHP działających w systemie Windows i nigdy nie była problemem na Uniksie.
— Álvaro González

Podoba mi się ta odpowiedź. To świetny wybór do konwersji dat na strtotime ()
— Erich García

2
Czy nie brzmiałoby to teraz „Jeśli wszystkie wasze daty są późniejsze niż 1 stycznia 1970 r.” I „przed 2038 r.”? uważaj na błąd Y2k38. strtotimezwróci wartość false dla dłuższych dat. stackoverflow.com/questions/2012589/…
— blamb

Zwróć uwagę, że ta DateTimemetoda jest metodą preferowaną. Ten obiekt może zrobić znacznie więcej niż strtotimekiedykolwiek.
— Machavity

new DateTime('now')działa również, aby pobrać dzisiejszą datę
— Breith

23

Aby uzupełnić udzielone już odpowiedzi, zobacz następujący przykład:

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



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

Aktualizacja: Lub po prostu użyj starej szkoły date () :

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

1
Data jest funkcją, a nie klasą / konstruktorem.
— spdionis

2
@spdionis dzięki za komentarz, zmieniłem wielką literę, aby usunąć możliwe nieporozumienia.
— d.raev

6

Nie zrobiłbym tego z PHP. Baza danych powinna wiedzieć, jaki dzień jest dzisiaj. (Użyj na przykład MySQL-> NOW ()), więc porównanie w zapytaniu będzie bardzo łatwe i zwrócenie wyniku, bez żadnych problemów, w zależności od użytych typów dat

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

dzięki, ale faktycznie używam date (), nie przechowuję dzisiejszej daty w bazie danych
— Sarmen B.

4
Ale przechowujesz expireDate w bazie danych. Porównaj tę datę z NOW ()
— 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

Oto sposób, w jaki sposób uzyskać różnicę między dwiema datami w minutach.

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

Pytanie dotyczy porównania 2 dat - twoją odpowiedzią jest dodanie mnóstwa dodatkowych rzeczy (np. Ustawienie statusu online / offline), które nie są konieczne jako odpowiedź na pytanie. Część Twojej odpowiedzi, w której ma miejsce porównanie, jest praktycznie taka sama, jak już istniejąca odpowiedź tutaj .
— crazyloonybin

Zaktualizowałem pytanie, zamieściłem złą odpowiedź w niewłaściwym pytaniu ^^;) To nie to samo, co odpowiedź, po prostu dodam mój wkład, jak je porównać i uzyskać różnicę w minutach.
— Syno

1
Usunąłem mój głos negatywny z powodu twojej aktualizacji, teraz wygląda znacznie lepiej :)
— crazyloonybin

2

Możesz konwertować daty na znaczniki czasu UNIX i porównywać różnice między nimi w sekundach.

$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

Ja też miałem ten problem i rozwiązuję go poprzez:

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

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

Dlaczego ta technika działa, należy wyjaśnić w odpowiedzi.
— mickmackusa

Odpowiedz na opublikowane pytanie OP, a nie jak rozwiązałeś swój własny, unikalny scenariusz.
— mickmackusa

0

Oto moje omówienie, jak uzyskać różnicę w dniach między dwiema datami za pomocą PHP. Zwróć uwagę na użycie znaku „!” w formacie, aby odrzucić część czasową dat, dzięki informacjom z DateTime createFromFormat bez czasu .

$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

Znalazłem odpowiedź na blogu i jest to tak proste, jak:

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

I otrzymasz dni między 2 datami.


Wydaje się, że rozwiązuje to inny problem. Proszę odpowiedzieć tylko na pytanie zadane przez PO.
— mickmackusa

-1

Działa to dzięki logice porównywania ciągów PHP. Po prostu możesz sprawdzić ...

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

Obie daty muszą mieć ten sam format. Cyfry muszą być wypełnione zerami po lewej stronie i uporządkowane od najbardziej znaczących do najmniej znaczących. Y-m-di Y-m-d H:i:sspełniają te warunki.


1
d-m-Ynie zadziała ... Y-m-d(z początkowym zerem jak 2016-05-08) zadziała. Sprawdź te daty w d-m-Yformacie 01-10-2016i 20-02-2016porównując jako ciągi 0 <2, przestanie porównywać, ale niepoprawnie ...
— Arxeiss

Oto dowód, że technika nie będzie w stanie prawidłowo porównać daty PO przeciw dniu dzisiejszym: 3v4l.org/SNHKT
— mickmackusa

PO ma inny format daty. wygląda data 2011-10-2.
— mickmackusa

-1

Jeśli chcesz, aby data ($ date) wygasła w pewnym przedziale, na przykład data wygaśnięcia tokena podczas resetowania hasła, oto jak możesz to zrobić:

$date = $row->expireDate;

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

$now = new \DateTime();

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

Ale w twoim przypadku możesz wykonać porównanie w następujący sposób:

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

$date = $row->expireDate;

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

Ta odpowiedź ignoruje pierwotnie opublikowane pytanie. Proszę skorzystać z przykładowych danych dostarczonych przez PO.
— mickmackusa

Nie jest to dokładnie to, o co facet prosi o pomoc, ale pomyślałem, że ten sposób może pomóc, jeśli zrozumie się zasady.
— faye.babacar78

Rozumiem zasady, ale ten kod nie odpowiada na zadane pytanie. Ta strona jest już przepełniona błędnymi i niepowiązanymi odpowiedziami - to tylko dezorientuje badaczy i marnuje ich czas. Staram się szukać naukowców.
— mickmackusa

Myślę, że nie jest to takie trudne, mógł użyć klasy DateTime () zamiast funkcji date (). Odpowiedź, którą umieściłem powyżej, ma na celu przedstawienie naukowcom pomysłów.
— faye.babacar78

1
Przestanę się powtarzać i wycofam się z tej dyskusji. Drugie co do wielkości rozwiązanie ( stackoverflow.com/a/3847762/2943403 ) pokazuje strasznie prosty (nie do pobicia) sposób tworzenia dwóch obiektów datetime. Nie mam pojęcia, co robi twoja magiczna requestDate()metoda - nigdzie o niej nie ma mowy. Nie użyłbym twojej odpowiedzi ani nie poleciłbym badaczowi skorzystania z twojego rozwiązania. Nie przewiduję zmiany mojego głosu.
— mickmackusa

-2

Przede wszystkim spróbuj nadać aktualny format daty i czasu serwera w żądanym formacie:

  1. Uzyskaj aktualną datę i godzinę

    $ current_date = getdate ();

  2. Oddzielną datę i godzinę, aby zarządzać nimi według własnego uznania:

$ current_date_only = $ current_date [rok] .'- '. $ current_date [mon] .'-'. $ current_date [mday]; $ current_time_only = $ current_date ['hours']. ':'. $ current_date ['minutes']. ':'. $ current_date ['seconds'];

  1. Porównaj to w zależności od tego, czy używasz daty donly czy datetime w swojej bazie danych:

    $ dzisiaj = $ current_date_only. ' '. $ current_time_only;

    lub

    $ dzisiaj = $ current_date_only;

    if ($ dzisiaj <$ expireDate)

mam nadzieję, że to pomoże


Ta odpowiedź nie jest próbą rozwiązania pierwotnego pytania. OP nie interesuje się godzinami, minutami ani sekundami.
— mickmackusa
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.