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ć?


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


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.


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

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

}

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


$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

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

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


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

(przykład w3schools, działa idealnie)


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!


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

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
}

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;

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.