Risposte:
strtotime($var);
Lo trasforma in un valore temporale
time() - strtotime($var);
Ti dà i secondi da allora $var
if((time()-(60*60*24)) < strtotime($var))
Controllerà se $var
è stato nell'ultimo giorno.
Tale formato è perfettamente appropriato per un confronto di stringhe standard, ad es
if ($date1 > $date2){
//Action
}
Per ottenere la data odierna in quel formato, è sufficiente utilizzare: date("Y-m-d H:i:s")
.
Così:
$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";
if ($date < $today) {}
Questa è la bellezza di quel formato: ordina bene. Certo, potrebbe essere meno efficiente, a seconda delle circostanze esatte, ma potrebbe anche essere molto più conveniente e portare a un codice più gestibile - avremmo bisogno di sapere di più per fare davvero quella sentenza.
Per il fuso orario corretto, è possibile utilizzare, ad esempio,
date_default_timezone_set('America/New_York');
Fare clic qui per fare riferimento ai fusi orari PHP disponibili.
mm/dd/yyyy
di data e ora in formato fino ad oggi e quindi confrontarle. Mi preoccupo sempre quando gli sviluppatori hanno date in più fusi orari nel loro sistema. Penso che sia meglio memorizzare le date nel tuo sistema, sempre in un singolo fuso orario e quindi visualizzarlo in qualsiasi fuso orario richiesto. Ho iniziato a utilizzare il yyyy-mm-dd
formato (o yyyymmdd
) intorno al 1998 quando mi sono reso conto che si ordina molto più velocemente anche in SQL Server.
Ecco qui:
function isToday($time) // midnight second
{
return (strtotime($time) === strtotime('today'));
}
isToday('2010-01-22 00:00:00.0'); // true
Inoltre, alcune altre funzioni di supporto:
function isPast($time)
{
return (strtotime($time) < time());
}
function isFuture($time)
{
return (strtotime($time) > time());
}
if(strtotime('2013-01-22 00:00:00.00') < time()){....}
e lo ha fatto per me.
Per completare BoBby Jack, l'uso di DateTime OBject, se hai php 5.2.2+:
if(new DateTime() > new DateTime($var)){
// $var is before today so use it
}
Puoi usare la DateTime
classe:
$past = new DateTime("2010-01-01 00:00:00");
$now = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");
Gli operatori di confronto lavorano *:
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)
È anche possibile catturare i valori di data e ora dagli oggetti DateTime e confrontarli:
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)
* Si noti che ===
restituisce false quando si confrontano due diversi oggetti DateTime anche quando rappresentano la stessa data.
$future
è diventato il passato. : 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
eguaglia anche il mio in OP
Un'attenzione basata sulla mia esperienza, se il tuo scopo riguarda solo la data, fai attenzione a includere il timestamp . Ad esempio, supponiamo che oggi lo sia "2016-11-09"
. Il confronto che coinvolge il timestamp annullerà qui la logica. Esempio,
// 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.
}
Il codice sopra sembra giusto, ma se è SOLO la data che vuoi confrontare, allora il codice sopra non è la logica giusta. Perché? Perché time () e strtotime () forniranno include timestamp. Cioè, anche se entrambe le date cadono nello stesso giorno, ma la differenza nel tempo sarà importante. Considera l'esempio seguente:
// plain date string
$input = "2016-11-09";
Poiché l'input è una stringa di data semplice, l'utilizzo di strtotime()
on $input
presuppone che sia la mezzanotte del 09/11/2016. Quindi, correndotime()
qualsiasi momento dopo mezzanotte tratterà sempre $input
come passato, anche se sono nello stesso giorno.
Per risolvere questo problema, puoi semplicemente codificare, in questo modo:
if (date("Y-m-d") <= $input)
{
echo "Input date is equal to or greater than today.";
}
Pochi anni dopo, secondo l'osservazione di Bobby Jack che le ultime 24 ore non sono oggi !!! E sono sorpreso che la risposta sia stata così votata ...
Per confrontare se una determinata data è inferiore, uguale o maggiore di un'altra, è necessario innanzitutto ruotarle "verso il basso" all'inizio della giornata. In altre parole, assicurati di parlare della stessa ora 00:00:00 in entrambe le date. Questo può essere fatto in modo semplice ed elegante come:
strtotime("today") <=> strtotime($var)
se $var
ha la parte temporale su 00:00:00 come specificato nell'OP.
Sostituisci <=>
con quello che ti serve (o mantienilo così in php 7)
Inoltre, ovviamente, stiamo parlando dello stesso fuso orario per entrambi. Per l' elenco dei fusi orari supportati
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
(l'esempio di w3schools, funziona perfettamente)
Espandendo la risposta di Josua da 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';}
Spero che aiuti. Il mio primo post su StackOverflow!
Confronta gli oggetti data e ora:
(Ho scelto 10 giorni - Tutto ciò che è più vecchio di 10 giorni è "VECCHIO", altrimenti "NUOVO")
$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');
}
Alcune risposte fornite non hanno in considerazione il giorno corrente!
Ecco la mia proposta
$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
}
Se fai cose con ora e date Carbon è il tuo migliore amico;
Installa il pacchetto quindi:
$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 = minore di, gt = maggiore di
Come nella domanda:
$theDay->gt(Carbon::today()) ? true : false;
e altro ancora;