25 gennaio 2016

PHP: confronto tra due date

Il 12 agosto 2016 è successivo al 12 febbraio 2016? E quanti giorni separano le due date? Per noi esseri umani la risposta è relativamente semplice, ma per un'entità in silicio il confronto non è così immediato.
Infatti, per confrontare due date dobbiamo trasformarle in timestamp, cioè in un numero che rappresenta i secondi intercorsi dalla mezzanotte del 01 gennaio 1970. In questo modo possiamo confrontare aritmeticamente due numeri e stabilire chi è il maggiore, quale differenza c'è tra i due, etc.

A cosa possono servire queste operazioni di confronto? Gli esempi sono molteplici: visualizzare un coupon per un'offerta valida in un determinato periodo di tempo, calcolare il tempo che manca all'inizio di un evento, calcolare l'età di una persona, etc.
Qui una semplice applicazione per evidenziare dinamicamente la stagione dell'anno:

demo confronto date
DEMO

Tra le funzioni che mette a disposizione PHP abbiamo provato strtotime() funzione che trasforma una data in timestamp. La versatilità di questa funzione è elevata: il parametro accettato dalla funzione è una stringa, che può essere anche testuale (in lingua inglese). Vediamo ora come procedere:
memorizziamo in due variabili la data odierna e la data con cui fare il confronto:
$oggi = strtotime("now");
$dataScadenza = strtotime("12-02-2016 22:42:00");
Il formato della data può essere dd-mm-yyyy hh:mm:ss oppure mm/dd/yyyy hh:mm:ss.
I parametri testuali sono molteplici. Oltre a now è possibile utilizzare ad esempio next o last (next Monday - la data del prossimo lunedì), il 25 dicembre dell'anno in corso (25 December).

Ora non ci resta che eseguire il confronto tra le due date e scrivere il codice da eseguire se il confronto risulta vero o falso:
if ($oggi < $dataScadenza){
       // codice da eseguire se la data attuale è precedente alla data di scadenza
} 
 else{
       // codice da eseguire se la data attuale è successiva alla data di scadenza
}
Se invece vogliamo delimitare un intervallo di tempo, dobbiamo definire tre variabili: la data odierna, la data di inizio dell'intervallo e la data di fine intervallo.
Questo frammento di codice è tratto dalla nostra demo:
$oggi = strtotime("now");
$equiP = strtotime("20 March");
$solstE = strtotime("20 June");

if ($oggi > $equiP && $oggi < $solstE){
       // codice da eseguire se la data attuale è compresa tra le due date
       echo '<img src="img/primavera.jpg" alt="primavera" />';
} 
 else{
       // codice da eseguire se la data attuale non è compresa tra le due date
       echo '<img src="img/primavera-gray.jpg" alt="primavera" />';
}

Per approfondire l'argomento:



4 commenti:

  1. Salve. Ho letto questo articolo sul confronto tra date in PHP e lo sto utilizzando per
    la visualizzazione a tempo determinato di banner pubbicitari. Riscontro un problema per la loro
    visualizzazione a seconda della data impostata. Nel codice che riporto sotto, ad esempio,
    non vengono visualizzati i banner 1.jpg e 2.jpg mentre il banner 3.jpg viene visualizzato.

    Non riesco a capire dove ci sia errore. Mi potete aiutare, per favore?

    Grazie, Giuseppe.

    PS. i tag di apertura e chiusura sono stati tolti perchè non accettati

    'immagini/banners/1.jpg',
    'start' => '21-11-2017',
    'end' => '22-11-2018',
    'url' => 'no',
    'website' => 'no'
    ),
    array(
    'image' => 'immagini/banners/2.jpg',
    'start' => '21-11-2017',
    'end' => '10-05-2018',
    'url' => 'http://www.sitoaziendale.com/',
    'website' => 'yes'
    ),
    array(
    'image' => 'immagini/banners/3.jpg',
    'start' => '09-11-2017',
    'end' => '30-07-2018',
    'url' => 'no',
    'website' => 'no'
    )
    // così di seguito per altri banner
    );

    shuffle($banners);


    $today = strtotime("now");

    foreach($banners as $banner) {

    $inizio = $banner['start'];
    $start = strtotime($inizio);
    $fine = $banner['end'];
    $end = strtotime($fine);

    if($today > $start && $today < $end && $banner['website'] == "yes") {
    echo "img src='$server/".$banner['image']."'\n";
    }

    if($today > $start && $today < $end && $banner['website'] == "no") {
    echo "img src='$server/".$banner['image']."'\n";
    }

    }

    RispondiElimina
    Risposte
    1. Ciao Giuseppe,
      abbiamo ricostruito il codice perché Blogger ha rimosso alcune parti e funziona.
      Hai controllato se la causa è più banale, tipo l'errato percorso/nome del file immagine?

      Elimina
    2. Grazie per la risposta.

      Si ho controllato, il percorso/nome è giusto, infatti il banner 3.jpg viene visualizzato in virtù della data diversa di scadenza mentre gli altri no.

      Non riesco proprio a capire come mai, eppure il codice mi sembra corretto

      Elimina
    3. Se vuoi, puoi contattarci via mail (la trovi in alto a destra) allegando la pagina php e magari il link alla tua prova online.

      Elimina