Wie kann ich zwei Daten in PHP vergleichen?

125

Wie kann ich zwei Daten in PHP vergleichen?

Das Datum wird im folgenden Format in der Datenbank gespeichert

2011-10-2

Wenn ich das heutige Datum mit dem Datum in der Datenbank vergleichen möchte, um festzustellen, welches größer ist, wie würde ich das tun?

Ich habe es versucht,

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

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

aber so funktioniert es nicht wirklich. Was ist eine andere Art, es zu tun?

Sarmen B.
quelle
Weisen Sie die Datumsangaben einem DateTime-Objekt zu und vergleichen Sie diese Objekte. Sie finden ein schönes Beispiel in stackoverflow.com/questions/961074/…
Peter

Antworten:

80

In der Datenbank sieht das Datum wie folgt aus: 2011-10-2

Speichern Sie es in JJJJ-MM-TT und dann funktioniert der Zeichenfolgenvergleich, weil '1'> '0' usw.

Matthew
quelle
2
aber was ist, wenn sie so aussehen, 2011-10-02 und 2012-02-10, für Monatsvergleich 1> 0, aber 2011-10-02 <2012-02-10
dav
14
@Davo, der Vergleich stoppt beim ersten Zeichen, das anders ist. In diesem Fall die vierte Ziffer von '1' <'2', sodass Sie das erwartete Ergebnis erhalten.
Matthew
1
Es tut mir leid :), war nicht vorsichtig genug.
Dav
wird das folgende funktionieren 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00?
Shorif2000
221

Wenn alle Ihre Daten nach dem 1. Januar 1970 liegen, können Sie Folgendes verwenden:

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

Wenn Sie PHP 5> = 5.2.0 verwenden, können Sie die DateTime-Klasse verwenden:

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

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

Oder etwas in diese Richtung.

Hugo Peixoto
quelle
Wenn ich mich richtig erinnere, gilt die Sorge 1st of January of 1970nur für alte Versionen von PHP, die unter Windows ausgeführt werden, und es war unter Unix nie ein Problem.
Álvaro González
Ich mag diese Antwort. Es ist eine gute Wahl, Daten in strtotime () umzuwandeln
Erich García
2
Wäre es jetzt nicht "Wenn alle Ihre Daten hinter dem 1. Januar 1970 liegen" und "vor 2038"? Achten Sie auf den y2k38-Fehler. strtotimewird für größere Daten false zurückgeben. stackoverflow.com/questions/2012589/…
blamb
Beachten Sie, dass die DateTimeMethode die bevorzugte Methode ist. Dieses Objekt kann weit mehr als strtotimeje zuvor.
Machavity
new DateTime('now')funktioniert auch, um das heutige Datum abzurufen
Breith
23

Um die bereits gegebenen Antworten zu ergänzen, sehen Sie sich das folgende Beispiel an:

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



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

Update: Oder verwenden Sie einfach die Funktion date () der alten Schule :

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   
d.raev
quelle
1
Datum ist eine Funktion, keine Klasse / Konstruktor.
spdionis
2
@spdionis danke für den Kommentar, ich habe den Großbuchstaben geändert, um mögliche Verwirrung zu beseitigen.
d.raev
6

Ich würde das nicht mit PHP machen. Eine Datenbank sollte wissen, welcher Tag heute ist (verwenden Sie beispielsweise MySQL-> NOW ()), damit es sehr einfach ist, innerhalb der Abfrage zu vergleichen und das Ergebnis ohne Probleme zurückzugeben, abhängig von den verwendeten Datumstypen

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName
Dr.Molle
quelle
danke, aber ich benutze tatsächlich date () Ich speichere das heutige Datum nicht in einer
Datenbank
4
Aber Sie speichern expireDate in einer Datenbank. Vergleichen Sie dieses Datum mit 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.";
}
Atif Mahmood
quelle
2

Hier erfahren Sie, wie Sie die Differenz zwischen zwei Daten in Minuten ermitteln können.

// 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;
Syno
quelle
Die Frage besteht darin, zwei Daten zu vergleichen. Ihre Antwort fügt eine Menge zusätzlicher Dinge hinzu (dh das Festlegen des Online- / Offline-Status), die als Antwort auf die Frage nicht erforderlich sind. Der Teil Ihrer Antwort, in dem der Vergleich stattfindet, ist praktisch derselbe wie die bereits vorhandene Antwort hier .
Crazyloonybin
Die Frage wurde aktualisiert, ich habe die falsche Antwort in der falschen Frage gepostet ^^;) Es ist nicht dasselbe wie die Antwort, ich füge nur meine Eingabe hinzu, wie man sie vergleicht und den Unterschied in Minuten erhält.
Syno
1
Ich habe meine Downvote wegen Ihres Updates entfernt, sieht jetzt viel besser aus :)
crazyloonybin
2

Sie können die Daten in UNIX-Zeitstempel konvertieren und die Differenz zwischen ihnen in Sekunden vergleichen.

$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";
   }
Shruthi Reddy
quelle
0

Ich hatte auch dieses Problem und löse es durch:

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

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}
PiotrK
quelle
Warum diese Technik funktioniert, sollte in der Antwort erklärt werden.
Mickmackusa
Bitte beantworten Sie die gestellte Frage des OP und nicht, wie Sie Ihr eigenes Szenario gelöst haben.
Mickmackusa
0

Hier ist mein Dreh, wie man mit PHP den Unterschied in Tagen zwischen zwei Daten ermittelt. Beachten Sie die Verwendung von '!' im Format, um den Zeitteil der Daten zu verwerfen, dank Informationen von DateTime createFromFormat ohne Zeit .

$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";
nwsmith
quelle
-1

Ich habe die Antwort in einem Blog gefunden und es ist so einfach wie:

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

Und Sie erhalten die Tage zwischen den beiden Daten.

Kooli
quelle
Dies scheint ein anderes Problem zu lösen. Bitte beantworten Sie nur die vom OP gestellte Frage.
Mickmackusa
-1

Dies funktioniert aufgrund der String-Vergleichslogik von PHP. Einfach können Sie überprüfen ...

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

Beide Daten müssen dasselbe Format haben. Die Ziffern müssen links mit Nullen aufgefüllt und von höchstwertig bis niedrigstwertig geordnet werden. Y-m-dund Y-m-d H:i:sdiese Bedingungen erfüllen.

Sanjyot
quelle
1
d-m-Ywird nicht funktionieren .. Y-m-d(mit führender Null wie 2016-05-08) wird funktionieren. Überprüfen Sie diese Daten im d-m-YFormat 01-10-2016und beim 20-02-2016Vergleich als Zeichenfolgen 0 <2 wird der Vergleich
gestoppt
Hier ist der Beweis, dass Ihre Technik die Daten des OP nicht korrekt mit dem heutigen Datum vergleichen kann: 3v4l.org/SNHKT
mickmackusa
Das OP hat ein anderes Datumsformat. das Datum sieht aus wie 2011-10-2.
mickmackusa
-1

Wenn Sie möchten, dass ein Datum ($ date) in einem bestimmten Intervall abläuft, z. B. ein Token-Ablaufdatum, wenn Sie ein Kennwort zurücksetzen, haben Sie folgende Möglichkeiten:

$date = $row->expireDate;

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

$now = new \DateTime();

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

In Ihrem Fall können Sie den Vergleich jedoch wie folgt durchführen:

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

$date = $row->expireDate;

if($today < $date) { /* do something */ }
faye.babacar78
quelle
Diese Antwort ignoriert die ursprünglich gestellte Frage. Bitte verwenden Sie die vom OP bereitgestellten Beispieldaten.
Mickmackusa
Es ist nicht genau das, was der Typ um Hilfe bittet, aber ich dachte, dieser Weg könnte helfen, wenn man die Prinzipien versteht.
faye.babacar78
Ich verstehe die Prinzipien, aber dieser Code beantwortet die gestellte Frage nicht. Diese Seite ist bereits mit falschen und nicht verwandten Antworten aufgebläht - dies verwirrt nur die Forscher und verschwendet ihre Zeit. Ich versuche nach Forschern Ausschau zu halten.
mickmackusa
Nun, ich denke es ist nicht so schwierig, er hätte die DateTime () Klasse anstelle der date () Funktion verwenden können. Die Antwort, die ich oben gegeben habe, besteht darin, den Forschern Ideen zu geben.
faye.babacar78
1
Ich werde aufhören, mich zu wiederholen, und mich von dieser Diskussion lösen. Die zweithöchste Lösung ( stackoverflow.com/a/3847762/2943403 ) zeigt eine schrecklich einfache (unschlagbare) Methode zum Erstellen von zwei Datetime-Objekten. Ich habe absolut keine Ahnung, was Ihre magische requestDate()Methode bewirkt - es wird nirgendwo erwähnt. Ich würde Ihre Antwort weder verwenden noch jedem Forscher empfehlen, Ihre Lösung zu verwenden. Ich sehe nicht voraus, dass ich meine Stimme ändere.
Mickmackusa
-2

Versuchen Sie zunächst, dem gewünschten Datum und der Uhrzeit Ihres Servers das gewünschte Format zuzuweisen:

  1. Erhalten Sie das aktuelle Datum und die Uhrzeit

    $ current_date = getdate ();

  2. Trennen Sie Datum und Uhrzeit, um sie nach Ihren Wünschen zu verwalten:

$ current_date_only = $ current_date [year] .'- '. $ current_date [mon] .'-'. $ current_date [mday]; $ current_time_only = $ current_date ['Stunden']. ':'. $ current_date ['Minuten']. ':'. $ current_date ['Sekunden'];

  1. Vergleichen Sie es, je nachdem, ob Sie in Ihrer Datenbank das Datum oder die Uhrzeit von donly verwenden:

    $ today = $ current_date_only. ' '. $ current_time_only;

    oder

    $ today = $ current_date_only;

    if ($ today <$ expireDate)

ich hoffe es hilft

ernestoloredo
quelle
Diese Antwort macht keinen Versuch, die ursprüngliche Frage zu lösen. Das OP hat kein Interesse an Stunden, Minuten oder Sekunden.
Mickmackusa