Odpowiedzi:
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 $var
minął ostatni dzień.
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.
mm/dd/yyyy
daty 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-dd
formatu (lub yyyymmdd
) około 1998 roku, kiedy zdałem sobie sprawę, że sortuje on znacznie szybciej, nawet na serwerze SQL.
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());
}
if(strtotime('2013-01-22 00:00:00.00') < time()){....}
i to zrobiło to dla mnie.
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
}
Możesz użyć DateTime
klasy:
$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ę.
$future
stało się przeszłością. : 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
jest moje równe w OP
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 $input
zakł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 $input
jak 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.";
}
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 $var
ma 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
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
(przykład w3schools, działa idealnie)
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!
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');
}
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
}
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;