Vergleichen Sie das angegebene Datum mit dem heutigen


216

Ich habe folgendes

$var = "2010-01-21 00:00:00.0"

Ich möchte dieses Datum mit dem heutigen Datum vergleichen (dh ich möchte wissen, ob dies $varvor dem heutigen Tag liegt oder heute gleich ist oder nicht).

Welche Funktion müsste ich verwenden?


5
Ich würde vorschlagen, auch die Zeitzone
einzustellen

Antworten:


289
strtotime($var);

Verwandelt es in einen Zeitwert

time() - strtotime($var);

Gibt Ihnen die Sekunden seit $var

if((time()-(60*60*24)) < strtotime($var))

Überprüft, ob $vares innerhalb des letzten Tages gewesen ist.


1
Für PHP 4 beenden Sie die letzte '.0' von $ var = "2010-01-21 00: 00: 00.0", andernfalls gibt strtotime -1 zurück
vivoconunxino

1
Ich benutze PHP 7.1. Der Teil der zweiten Sekunde wird einfach ignoriert, da die Rückgabe eine Ganzzahl mit der Anzahl der Sekunden ist.
Diogo Melo

208

Dieses Format ist perfekt für einen Standard-Zeichenfolgenvergleich geeignet, z

if ($date1 > $date2){
  //Action
}

Um das heutige Datum in diesem Format zu erhalten, verwenden Sie einfach : date("Y-m-d H:i:s").

So:

$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";

if ($date < $today) {}

Das ist das Schöne an diesem Format: Es bestellt gut. Das kann natürlich sein dies abhängig von Ihren genauen Umständen weniger effizient sein, aber es kann auch viel praktischer sein und zu einem besser wartbaren Code führen - wir müssten mehr wissen, um dieses Urteil wirklich zu fällen.

Für die richtige Zeitzone können Sie beispielsweise Folgendes verwenden:

date_default_timezone_set('America/New_York');

Klicken Sie hier , um auf die verfügbaren PHP-Zeitzonen zu verweisen.


2
Dies ignoriert auch die Zeitzone
Anushr

@anushr, wenn im Vergleich eine Zeitzone benötigt wird, kann die Zeitdifferenz vor dem Vergleich zum Datum hinzugefügt werden. Dies ist immer noch schneller als der Versuch, zwei Datums- / Uhrzeitzeichenfolgen im mm/dd/yyyyFormat in Datum zu konvertieren und dann zu vergleichen. Es macht mir immer Sorgen, wenn Entwickler Daten in mehreren Zeitzonen in ihrem System haben. Ich denke, es ist besser, Daten in Ihrem System zu speichern, immer in einer einzigen Zeitzone, und sie dann in der gewünschten Zeitzone anzuzeigen. Ich habe um 1998 angefangen, yyyy-mm-ddFormat (oder yyyymmdd) zu verwenden, als mir klar wurde, dass es selbst in SQL Server viel schneller sortiert.
AaA

59

Bitte schön:

function isToday($time) // midnight second
{
    return (strtotime($time) === strtotime('today'));
}

isToday('2010-01-22 00:00:00.0'); // true

Einige weitere Hilfsfunktionen:

function isPast($time)
{
    return (strtotime($time) < time());
}

function isFuture($time)
{
    return (strtotime($time) > time());
}

Warum die seltsame Rückwärtslogik und die fremden Booleschen Werte? Warum nicht einfach "strtotime ($ time) == strtotime ('today') zurückgeben", "strtotime ($ time)> time () zurückgeben" und "strtotime ($ time) <time () zurückgeben"?
Bobby Jack

@ Bobby Jack: Ich hatte mehr Funktionen in diesen Funktionen und habe vergessen, den zusätzlichen Code zu löschen. Jetzt behoben.
Alix Axel

+1 auf der Hilfsfunktion, speziell isPast b / c Ich habe gerade a ausgeführt if(strtotime('2013-01-22 00:00:00.00') < time()){....}und das hat es für mich getan.
MDMoore313

47

Um BoBby Jack zu vervollständigen, verwenden Sie DateTime OBject, wenn Sie PHP 5.2.2+ haben:

if(new DateTime() > new DateTime($var)){
    // $var is before today so use it

}

Das ist nicht richtig. Wenn $ var der aktuelle Tag ist (nach genau Mitternacht), ist new DateTime () größer als new DateTime ($ var) und es ist nicht wahr, dass $ var vor heute liegt.
Dxvargas

46

Sie können die DateTimeKlasse verwenden:

$past   = new DateTime("2010-01-01 00:00:00");
$now    = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");

Vergleichsoperatoren arbeiten *:

var_dump($past   < $now);         // bool(true)
var_dump($future < $now);         // bool(false)

var_dump($now == $past);          // bool(false)
var_dump($now == new DateTime()); // bool(true)
var_dump($now == $future);        // bool(false)

var_dump($past   > $now);         // bool(false)
var_dump($future > $now);         // bool(true)

Es ist auch möglich, die Zeitstempelwerte von DateTime-Objekten abzurufen und zu vergleichen:

var_dump($past  ->getTimestamp());                        // int(1262286000)
var_dump($now   ->getTimestamp());                        // int(1431686228)
var_dump($future->getTimestamp());                        // int(1577818800)
var_dump($past  ->getTimestamp() < $now->getTimestamp()); // bool(true)
var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)

* Beachten Sie, dass ===beim Vergleich zweier verschiedener DateTime-Objekte false zurückgegeben wird, auch wenn sie dasselbe Datum darstellen.


$futureist Vergangenheit geworden. : P
mbomb007

Meine Güte, wie die Zeit vergeht.
Salman A

13
$toBeComparedDate = '2014-08-12';
$today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
$expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');

var_dump(strtotime($today) > strtotime($expiry)); //false or true

das ist nicht das, was ich $varauch in OP
Alexus

1
Und Sie benötigen PHP> = 5.4 für (neues DateTime ()) -> Format ('Ym-d');
webrama.pl

6

Eine Vorsichtsmaßnahme nach meiner Erfahrung: Wenn Ihr Zweck nur das Datum betrifft, achten Sie darauf, den Zeitstempel anzugeben . Zum Beispiel sagen wir heute ist "2016-11-09". Ein Vergleich mit einem Zeitstempel macht die Logik hier ungültig. Beispiel,

//  input
$var = "2016-11-09 00:00:00.0";

//  check if date is today or in the future
if ( time() <= strtotime($var) ) 
{
    //  This seems right, but if it's ONLY date you are after
    //  then the code might treat $var as past depending on
    //  the time.
}

Der obige Code scheint richtig zu sein, aber wenn es NUR das Datum ist, das Sie vergleichen möchten, ist der obige Code nicht die richtige Logik. Warum? Weil time () und strtotime () einen Zeitstempel enthalten. Das heißt, obwohl beide Daten auf denselben Tag fallen, spielt der Zeitunterschied eine Rolle. Betrachten Sie das folgende Beispiel:

//  plain date string
$input = "2016-11-09";

Da es sich bei der Eingabe um eine einfache Datumszeichenfolge handelt, wird bei Verwendung von strtotime()on $inputdavon ausgegangen, dass es die Mitternacht des 09.11.2016 ist. time()Wenn Sie also jederzeit nach Mitternacht laufen, ist dies immer eine gute Sache$input als Vergangenheit , auch wenn sie am selben Tag stattfinden.

Um dies zu beheben, können Sie einfach wie folgt codieren:

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}

1
Ich bin mir sicher, dass OP dies in Betracht gezogen hat, und deshalb haben sie "00: 00: 00.0" in ihre Frage aufgenommen
AaA

6

Wenige Jahre später stimme ich Bobby Jacks Beobachtung zu, dass die letzten 24 Stunden nicht heute sind !!! Und ich bin überrascht, dass die Antwort so positiv bewertet wurde ...

Um zu vergleichen, ob ein bestimmtes Datum kleiner, gleich oder größer als ein anderes ist, müssen Sie es zuerst bis zum Beginn des Tages "ablehnen". Mit anderen Worten, stellen Sie sicher, dass Sie an beiden Daten über dieselbe 00:00:00 Uhr sprechen. Dies kann einfach und elegant erfolgen als:

strtotime("today") <=> strtotime($var)

wenn $var der Zeitteil auf 00:00:00 wie im OP angegeben ist.

Ersetzen <=> durch alles, was Sie brauchen (oder behalten Sie es so in PHP 7)

Außerdem sprechen wir natürlich für beide von derselben Zeitzone. Für eine Liste der unterstützten Zeitzonen


5
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);

(Das Beispiel von w3schools funktioniert perfekt.)


4

Erweiterung von Josuas Antwort von w3schools:

//create objects for the dates to compare
$date1=date_create($someDate);
$date2=date_create(date("Y-m-d"));
$diff=date_diff($date1,$date2);
//now convert the $diff object to type integer
$intDiff = $diff->format("%R%a");
$intDiff = intval($intDiff);
//now compare the two dates
if ($intDiff > 0)  {echo '$date1 is in the past';}
else {echo 'date1 is today or in the future';}

Ich hoffe das hilft. Mein erster Beitrag zum Stackoverflow!


1

Vergleichen Sie Datums- und Uhrzeitobjekte:

(Ich habe 10 Tage ausgewählt - Alles, was älter als 10 Tage ist, ist "ALT", sonst "NEU")

$now   = new DateTime();
$diff=date_diff($yourdate,$now);
$diff_days = $diff->format("%a");
if($diff_days > 10){
    echo "OLD! " . $yourdate->format('m/d/Y');
}else{
    echo "NEW! " . $yourdate->format('m/d/Y');
}

1

Einige gegebene Antworten berücksichtigen den aktuellen Tag nicht!

Hier ist mein Vorschlag.

$var = "2010-01-21 00:00:00.0"
$given_date = new \DateTime($var);

if ($given_date == new \DateTime('today')) {
  //today
}

if ($given_date < new \DateTime('today')) {
  //past
}

if ($given_date > new \DateTime('today')) {
  //future
}

0

Wenn Sie Dinge mit Zeit und Datum tun, ist Carbon Ihr bester Freund.

Installieren Sie das Paket dann:

$theDay = Carbon::make("2010-01-21 00:00:00.0");

$theDay->isToday();
$theDay->isPast();
$theDay->isFuture();
if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))

lt = kleiner als, gt = größer als

Wie in der Frage:

$theDay->gt(Carbon::today()) ? true : false;

und vieles mehr;

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.