Come posso confrontare due date in PHP?


125

Come posso confrontare due date in PHP?

La data viene memorizzata nel database nel seguente formato

2011/10/02

Se volessi confrontare la data odierna con la data nel database per vedere qual è la maggiore, come lo farei?

Ho provato questo

$today = date("Y-m-d");
$expire = $row->expireDate //from db

if($today < $expireDate) { //do something; }

ma non funziona davvero in questo modo. Qual è un altro modo per farlo?


Assegnare le date del database a un oggetto DateTime e quindi confrontare quegli oggetti. Puoi trovare un bell'esempio in stackoverflow.com/questions/961074/…
Peter

Risposte:


80

nel database la data è simile a questa 2011-10-2

Memorizzalo in AAAA-MM-GG e poi il confronto tra stringhe funzionerà perché '1'> '0', ecc.


2
ma cosa succede se hanno questo aspetto, 2011-10-02 e 2012-02-10, per il confronto mensile 1> 0, ma 2011-10-02 <2012-02-10
dav

14
@Davo, il confronto si ferma al primo carattere che è diverso. In questo caso, la quarta cifra di "1" <"2", quindi ottieni il risultato che ti aspetti.
Matteo

1
Mi dispiace :), non sono stato abbastanza attento.
dav

funzionerà il seguente 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00?
shorif2000

221

Se tutte le date sono posteriori al 1 ° gennaio 1970, potresti usare qualcosa come:

$today = date("Y-m-d");
$expire = $row->expireDate; //from database

$today_time = strtotime($today);
$expire_time = strtotime($expire);

if ($expire_time < $today_time) { /* do Something */ }

Se stai usando PHP 5> = 5.2.0, potresti usare la classe DateTime:

$today_dt = new DateTime($today);
$expire_dt = new DateTime($expire);

if ($expire_dt < $today_dt) { /* Do something */ }

O qualcosa del genere.


Se ricordo bene, la preoccupazione riguarda 1st of January of 1970solo le vecchie versioni di PHP in esecuzione su Windows e non è mai stato un problema su Unix.
Álvaro González

Mi piace questa risposta. È un'ottima scelta convertire le date in strtotime ()
Erich García

2
Non sarebbe ora "Se tutte le date sono posteriori al 1 ° gennaio 1970" e "precedenti al 2038"? guarda il nostro per il bug y2k38. strtotimerestituirà false per date più grandi. stackoverflow.com/questions/2012589/...
blamb

Nota che il DateTimemetodo è il metodo preferito. Quell'oggetto può fare molto più che strtotimemai.
Machavity

new DateTime('now')funziona anche per recuperare la data odierna
Breith

23

Solo per complimentarmi con le risposte già fornite, guarda il seguente esempio:

$today = new DateTime('');
$expireDate = new DateTime($row->expireDate); //from database



if($today->format("Y-m-d") < $expireDate->format("Y-m-d")) { 
    //do something; 
}

Aggiornamento: o usa semplicemente la funzione date () della vecchia scuola :

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   

1
La data è una funzione, non una classe / costruttore.
spdionis

2
@spdionis grazie per il commento, ho cambiato la maiuscola per eliminare possibile confusione.
d.raev

6

Non lo farei con PHP. Un database dovrebbe sapere che giorno è oggi (usa MySQL-> NOW () per esempio), quindi sarà molto facile confrontare all'interno della query e restituire il risultato, senza problemi a seconda dei tipi di data utilizzati

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName

grazie ma in realtà uso date () non memorizzo la data odierna in un db
Sarmen B.

4
Ma memorizzi expireDate in un db. Confronta questa data con NOW ()
Dottor Molle

4
$today = date('Y-m-d');//Y-m-d H:i:s
$expireDate = new DateTime($row->expireDate);// From db 
$date1=date_create($today);
$date2=date_create($expireDate->format('Y-m-d'));
$diff=date_diff($date1,$date2);

//echo $timeDiff;
if($diff->days >= 30){
    echo "Expired.";
}else{
    echo "Not expired.";
}

2

Ecco un modo su come ottenere la differenza tra due date in pochi minuti.

// set dates
$date_compare1= date("d-m-Y h:i:s a", strtotime($date1));
// date now
$date_compare2= date("d-m-Y h:i:s a", strtotime($date2));

// calculate the difference
$difference = strtotime($date_compare1) - strtotime($date_compare2);
$difference_in_minutes = $difference / 60;

echo $difference_in_minutes;

La domanda sta chiedendo di confrontare 2 date: la tua risposta sta aggiungendo un carico di cose extra (ad esempio l'impostazione dello stato online / offline) che non è necessario come risposta alla domanda. La parte della tua risposta in cui avviene il confronto è praticamente la stessa della risposta già esistente qui .
crazyloonybin

Aggiornata la domanda, ho pubblicato la risposta sbagliata nella domanda sbagliata ^^;) Non è la stessa della risposta, aggiungo solo il mio contributo su come confrontarli e ottenere la differenza in pochi minuti.
Sinodo

1
Ho rimosso il mio
voto negativo a

2

Puoi convertire le date in timestamp UNIX e confrontare la differenza tra loro in secondi.

$today_date=date("Y-m-d");
$entered_date=$_POST['date'];
$dateTimestamp1 = strtotime($today_date);
$dateTimestamp2 = strtotime($entered_date);
$diff= $dateTimestamp1-$dateTimestamp2;
//echo $diff;
if ($diff<=0)
   {
     echo "Enter a valid date";
   }

0

Anch'io ho avuto quel problema e lo risolvo:

$today = date("Ymd");
$expire = str_replace('-', '', $row->expireDate); //from db

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}

Perché questa tecnica funziona dovrebbe essere spiegato nella risposta.
mickmackusa

Si prega di rispondere alla domanda pubblicata dall'OP, non su come hai risolto il tuo scenario unico.
mickmackusa

0

Ecco il mio giro su come ottenere la differenza di giorni tra due date con PHP. Nota l'uso di "!" nel formato per scartare la parte temporale delle date, grazie alle informazioni di DateTime createFromFormat senza tempo .

$today = DateTime::createFromFormat('!Y-m-d', date('Y-m-d'));
$wanted = DateTime::createFromFormat('!d-m-Y', $row["WANTED_DELIVERY_DATE"]);
$diff = $today->diff($wanted);
$days = $diff->days;
if (($diff->invert) != 0) $days = -1 * $days;
$overdue = (($days < 0) ? true : false);
print "<!-- (".(($days > 0) ? '+' : '').($days).") -->\n";

-1

Ho trovato la risposta su un blog ed è semplice come:

strtotime(date("Y"."-01-01")) -strtotime($newdate))/86400

E otterrai i giorni tra le 2 date.


Questo sembra risolvere un problema diverso. Si prega di rispondere solo alla domanda posta dall'OP.
mickmackusa

-1

Funziona a causa della logica di confronto delle stringhe di PHP. Semplicemente puoi controllare ...

if ($startdate < $date) {// do something} 
if ($startdate > $date) {// do something}

Entrambe le date devono essere nello stesso formato. Le cifre devono essere riempite con zero a sinistra e ordinate dal più significativo al meno significativo. Y-m-de Y-m-d H:i:ssoddisfare queste condizioni.


1
d-m-Ynon funzionerà .. Y-m-d(con zero iniziale come 2016-05-08) funzionerà. Controlla quelle date nel d-m-Yformato 01-10-2016e 20-02-2016, confrontandole come stringhe 0 <2, interromperà il confronto ma in modo errato ...
Arxeiss

Ecco la prova che la tua tecnica non riuscirà a confrontare correttamente le date dell'OP con la data odierna: 3v4l.org/SNHKT
mickmackusa

L'OP ha un formato di data diverso. la data sembra 2011-10-2.
mickmackusa

-1

Se vuoi che una data ($ date) scada in un certo intervallo, ad esempio una data di scadenza del token quando esegui un ripristino della password, ecco come puoi fare:

$date = $row->expireDate;

$date->add(new DateInterval('PT24H')); // adds 24 hours

$now = new \DateTime();

if($now < $date) { /* expired after 24 hours */ }

Ma nel tuo caso potresti fare il confronto proprio come segue:

$today = new DateTime('Y-m-d');

$date = $row->expireDate;

if($today < $date) { /* do something */ }

Questa risposta ignora la domanda pubblicata originariamente. Si prega di utilizzare i dati campione forniti dall'OP.
mickmackusa

Non è esattamente ciò che il ragazzo chiede aiuto, ma ho pensato che in questo modo potrebbe aiutare se si capiscono i principi.
faye.babacar78

Capisco i principi, ma questo codice non risponde alla domanda posta. Questa pagina è già piena di risposte errate e non correlate: questo confonde solo i ricercatori e fa perdere tempo. Sto cercando di cercare ricercatori.
mickmackusa

Beh, penso che non sia così difficile, avrebbe potuto usare la classe DateTime () invece della funzione date (). La risposta che ho messo sopra è in qualche modo dare idee ai ricercatori.
faye.babacar78

1
Smetterò di ripetermi e mi disimpegnerò da questa discussione. La seconda soluzione più alta ( stackoverflow.com/a/3847762/2943403 ) mostra un modo terribilmente semplice (imbattibile) di creare due oggetti datetime. Non ho assolutamente idea di cosa requestDate()faccia il tuo metodo magico - non se ne parla da nessuna parte. Non userò la tua risposta, né consiglierei a nessun ricercatore di utilizzare la tua soluzione. Non prevedo di cambiare il mio voto.
mickmackusa

-2

prima di tutto, prova a dare il formato che desideri alla data e all'ora corrente del tuo server:

  1. Ottenere la data e l'ora corrente

    $ data_attuale = getdate ();

  2. Data e ora separate per gestirle come desideri:

$ current_date_only = $ current_date [anno] .'- '. $ current_date [lun] .'-'. $ current_date [mday]; $ current_time_only = $ data_attuale ['ore']. ':'. $ data_attuale ['minuti']. ':'. $ data_attuale ['secondi'];

  1. Confrontalo a seconda che tu stia utilizzando donly date o datetime nel tuo DB:

    $ today = $ current_date_only. " ' $ Current_time_only.;

    o

    $ today = $ current_date_only;

    if ($ today <$ expireDate)

spero che sia d'aiuto


Questa risposta non cerca di risolvere la domanda originale. L'OP non ha alcun interesse in ore, minuti o secondi.
mickmackusa
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.