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?


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.


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.


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! 
}   

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

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.";
}

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;

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";
   }

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

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

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


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.


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

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


Diese Antwort macht keinen Versuch, die ursprüngliche Frage zu lösen. Das OP hat kein Interesse an Stunden, Minuten oder Sekunden.
Mickmackusa
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.