Confronta la data indicata con oggi


216

Ho seguito

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

Vorrei confrontare questa data con la data di oggi (cioè vorrei sapere se questa $varè prima di oggi o è uguale a oggi o no)

Quale funzione dovrei usare?


5
Vorrei suggerire di impostare anche il fuso orario
NJInamdar

Risposte:


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


1
per php 4 esci dall'ultimo '.0' da $ var = "2010-01-21 00: 00: 00.0", altrimenti strtotime restituirà -1
vivoconunxino

1
Sto usando PHP 7.1. La parte del secondo è appena ignorata, dato che il ritorno è un numero intero con il numero di secondi.
Diogo Melo,

209

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.


2
Ciò ignora anche il fuso orario
anushr

@anushr, se in confronto è necessario il fuso orario, la differenza di orario può essere aggiunta fino ad oggi prima del confronto. Questo è ancora più veloce del tentativo di convertire due stringhe mm/dd/yyyydi 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-ddformato (o yyyymmdd) intorno al 1998 quando mi sono reso conto che si ordina molto più velocemente anche in SQL Server.
AaA

59

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

Perché la strana logica all'indietro e i booleani estranei? Perché non solo "return strtotime ($ time) == strtotime ('today')", "return strtotime ($ time)> time ()" e "return strtotime ($ time) <time ()"?
Bobby Jack,

@Bobby Jack: avevo più funzionalità in quelle funzioni, ho dimenticato di eliminare il codice aggiuntivo. Riparato ora.
Alix Axel il

+1 sulla funzione helper, in particolare isPast b / c, ho appena eseguito a if(strtotime('2013-01-22 00:00:00.00') < time()){....}e lo ha fatto per me.
MDMoore313,

47

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

}

Questo non è corretto Se $ var è il giorno corrente (dopo la mezzanotte esatta), il nuovo DateTime () sarà più grande del nuovo DateTime ($ var) e non è vero $ var è prima di oggi.
dxvargas,

46

Puoi usare la DateTimeclasse:

$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
mbomb007,

Mio, come vola il tempo.
Salman,

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

non è quello che $vareguaglia anche il mio in OP
alexus

1
E hai bisogno di PHP> = 5.4 per (new DateTime ()) -> format ('Ym-d');
webrama.pl,

6

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 $inputpresuppone che sia la mezzanotte del 09/11/2016. Quindi, correndotime() qualsiasi momento dopo mezzanotte tratterà sempre $inputcome 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.";
}

1
Sono sicuro che OP lo abbia considerato ed è per questo che hanno incluso `00: 00: 00.0 'nella loro domanda
AaA

6

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 $varha 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


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

(l'esempio di w3schools, funziona perfettamente)


4

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!


1

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

1

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
}

0

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;

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.