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 $var
vor dem heutigen Tag liegt oder heute gleich ist oder nicht).
Welche Funktion müsste ich verwenden?
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 $var
vor dem heutigen Tag liegt oder heute gleich ist oder nicht).
Welche Funktion müsste ich verwenden?
Antworten:
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 $var
es innerhalb des letzten Tages gewesen ist.
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.
mm/dd/yyyy
Format 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-dd
Format (oder yyyymmdd
) zu verwenden, als mir klar wurde, dass es selbst in SQL Server viel schneller sortiert.
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());
}
if(strtotime('2013-01-22 00:00:00.00') < time()){....}
und das hat es für mich getan.
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
}
Sie können die DateTime
Klasse 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.
$future
ist Vergangenheit geworden. : P
$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
$var
auch in OP
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 $input
davon 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.";
}
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
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
(Das Beispiel von w3schools funktioniert perfekt.)
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!
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');
}
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
}
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;