Porównaj podaną datę z dzisiejszą

216

Mam następujące

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

Chciałbym porównać tę datę z datą dzisiejszą (tj. Chciałbym wiedzieć, czy $varjest ona wcześniejsza, czy równa się dziś, czy nie)

Jakiej funkcji powinienem użyć?

Alexus
źródło
5
Proponuję również ustawić strefę czasową
NJInamdar

Odpowiedzi:

289
strtotime($var);

Zamienia to w wartość czasu

time() - strtotime($var);

Od tego momentu daje ci sekundy $var

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

Sprawdzi, czy $varminął ostatni dzień.

Tyler Carter
źródło
1
dla php 4 wyjdź z ostatniego '.0' z $ var = "2010-01-21 00: 00: 00.0", w przeciwnym razie strtotime zwróci -1
vivoconunxino
1
Używam PHP 7.1. Druga część jest po prostu ignorowana, ponieważ zwracana jest liczba całkowita z liczbą sekund.
Diogo Melo
209

Ten format jest idealnie odpowiedni do standardowego porównania ciągów np

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

Aby uzyskać dzisiejszą datę w tym formacie, wystarczy użyć: date("Y-m-d H:i:s").

Więc:

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

if ($date < $today) {}

Na tym polega piękno tego formatu: ładnie się porządkuje. Oczywiście może to być mniej wydajne, w zależności od konkretnych okoliczności, ale może być także o wiele wygodniejsze i prowadzić do łatwiejszego do utrzymania kodu - musielibyśmy wiedzieć więcej, aby naprawdę wykonać to osąd.

Dla właściwej strefy czasowej możesz użyć na przykład:

date_default_timezone_set('America/New_York');

Kliknij tutaj, aby zapoznać się z dostępnymi strefami czasowymi PHP.

Bobby Jack
źródło
2
To również ignoruje strefę czasową
anushr
@anushr, jeśli strefa czasowa jest potrzebna do porównania, różnicę czasu można dodać do daty przed porównaniem. Jest to nadal szybsze niż próba konwersji dwóch ciągów mm/dd/yyyydaty i czasu w formacie do daty, a następnie ich porównanie. Zawsze martwię się, gdy programiści mają daty w wielu strefach czasowych w swoim systemie. Myślę, że lepiej jest przechowywać daty w systemie, zawsze w jednej strefie czasowej, a następnie wyświetlać je w dowolnej strefie czasowej. Zacząłem używać yyyy-mm-ddformatu (lub yyyymmdd) około 1998 roku, kiedy zdałem sobie sprawę, że sortuje on znacznie szybciej, nawet na serwerze SQL.
AaA
59

Proszę bardzo:

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

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

Ponadto kilka dodatkowych funkcji pomocniczych:

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

function isFuture($time)
{
    return (strtotime($time) > time());
}
Alix Axel
źródło
Dlaczego dziwna logika wsteczna i obce booleany? Dlaczego nie tylko „return strtotime ($ time) == strtotime ('Today')”, „return strtotime ($ time)> time ()” i „return strtotime ($ time) <time ()”?
Bobby Jack
@Bobby Jack: Miałem więcej funkcji w tych funkcjach, zapomniałem usunąć dodatkowy kod. Naprawiono teraz.
Alix Axel
+1 na funkcji pomocnika, konkretnie to Past b / c Właśnie uruchomiłem a if(strtotime('2013-01-22 00:00:00.00') < time()){....}i to zrobiło to dla mnie.
MDMoore313
47

Aby ukończyć BoBby Jack, użyj DateTime OBject, jeśli masz php 5.2.2+:

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

}
kamakazuu
źródło
To nie jest poprawne. Jeśli $ var jest bieżącym dniem (po dokładnej północy), nowy DateTime () będzie większy niż nowy DateTime ($ var) i to nieprawda, że ​​$ var jest przed dniem dzisiejszym.
dxvargas
46

Możesz użyć DateTimeklasy:

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

Operatory porównania działają *:

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)

Możliwe jest również pobranie wartości znaczników czasu z obiektów DateTime i porównanie ich:

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)

* Uwaga: ===zwraca wartość false podczas porównywania dwóch różnych obiektów DateTime, nawet jeśli reprezentują tę samą datę.

Salman A.
źródło
$futurestało się przeszłością. : P
mbomb007
Mój, jak czas płynie.
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
Hassan
źródło
to nie $varjest moje równe w OP
alexus
1
I potrzebujesz PHP> = 5.4 dla (new DateTime ()) -> format ('Ym-d');
webrama.pl
6

Jedna uwaga oparta na moim doświadczeniu, jeśli twój cel dotyczy tylko daty, pamiętaj o dołączeniu znacznika czasu . Powiedzmy, że dzisiaj jest "2016-11-09". Porównanie znacznika czasu unieważni tutaj logikę. Przykład,

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

Powyższy kod wydaje się odpowiedni, ale jeśli jest to TYLKO data, którą chcesz porównać, to powyższy kod nie jest właściwą logiką. Czemu? Ponieważ time () i strtotime () zapewnią dołączenie znacznika czasu. To znaczy, mimo że obie daty przypadają tego samego dnia, ale różnica w czasie będzie miała znaczenie. Rozważ poniższy przykład:

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

Ponieważ wejście jest zwykłym ciągiem daty, użycie strtotime()on $inputzakłada, że ​​jest północ północ 11.11.2016. Tak więc bieganie w time()dowolnym momencie po północy zawsze będzie traktowane $inputjak przeszłość, nawet jeśli są tego samego dnia.

Aby to naprawić, możesz po prostu napisać kod:

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}
Lynnell Emmanuel Neri
źródło
1
Jestem pewien, że OP zastanowił się nad tym i dlatego w swoim pytaniu umieścili „00: 00: 00.0”
AaA
6

Kilka lat później potwierdzam spostrzeżenie Bobby'ego Jacka, że ​​ostatnie 24 godziny nie są dzisiaj !!! I jestem zaskoczony, że odpowiedź była tak pozytywnie oceniona ...

Aby porównać, jeśli dana data jest mniejsza, równa lub większa od innej, najpierw musisz ją „zmniejszyć” do początku dnia. Innymi słowy, upewnij się, że mówisz o tej samej godzinie 00:00:00 w obu datach. Można to zrobić w prosty i elegancki sposób:

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

jeśli $varma część czasu na 00:00:00 jak określony PO.

Zamień na <=>cokolwiek potrzebujesz (lub zachowaj to w php 7)

Oczywiście mówimy o tej samej strefie czasowej dla obu. Aby uzyskać listę obsługiwanych stref czasowych

Nelu Bidonelu
źródło
5
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);

(przykład w3schools, działa idealnie)

Richard de Ree
źródło
4

Rozwijając odpowiedź Josua z 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';}

Mam nadzieję, że to pomoże. Mój pierwszy post na stackoverflow!

enceladus
źródło
1

Porównaj obiekty daty i godziny:

(Wybrałem 10 dni - wszystko starsze niż 10 dni to „STARE”, w przeciwnym razie „NOWE”)

$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');
}
Kevin
źródło
1

Niektóre podane odpowiedzi nie uwzględniają bieżącego dnia!

Oto moja propozycja.

$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
}
dxvargas
źródło
0

Jeśli robisz rzeczy z czasem i datami, Carbon jest twoim najlepszym przyjacielem;

Zainstaluj pakiet, a następnie:

$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 = mniej niż, gt = więcej niż

Jak w pytaniu:

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

i wiele więcej;

Lucas M. Oliveira
źródło