PHP: calcolare la differenza tra due date.

Per lavorare con le date il PHP mette a disposizione una classe apposita, la classe DateTime, tra i vari metdodi diponibili abbiamo quello che consente di calcolare la differenza tra due date, il problema è che la classe in questione è disponibile solo dalla versione 5.3.0 che non c’è sul mio server, quindi potrebbe tornare utile una funzione che compie questo calcolo, essendo quindi provetti programmatori ce la possiamo serenamente fare da soli.

La nostra funzione prenderà due date come parametri e restiruirà la differenza in giorni, le date avranno forma gg/mm/anno (ossia la nostra data usuale):

function datediff($d1,$d2){
    $arrD1 = split('/',$d1);
    $arrD2 = split('/',$d2);
    
    $time1 = mktime(0,0,0,$arrD1[1],$arrD1[0],$arrD1[2]);
    $time2 = mktime(0,0,0,$arrD2[1],$arrD2[0],$arrD2[2]);
    
    $secDif = $time1-$time2;
    
    if ($secDif<0) $secDif=$secDif*-1;
    $minDif =  $secDif / 60;
    $hourDif = $minDif / 60;
    $dayDif = $hourDif / 24;
    
    return round($dayDif);
}

Come avrete notaotato non ci sono controllo sulla correttezza dei dati passati, quindi un formato diverso genere un errore, anche passando date "sbagliate" tipo il 31/07/1974 otteniamo un errore.
I controlli di correttezza non sono complicati da aggiungere, si potrebbe ad esempio usare la funzione checkdate(), per la correttezza della data.

Ma ora dedichiamo un po' di attenzione alla funzione messa su. Per prima cosa spezziamo le due date in array contenenti giorno/mese/anno mediante la funzione split():

$arrD1 = split('/',$d1);
$arrD2 = split('/',$d2);

Poi abbiamo utlizzato la funzione mktime() che ci restituisce il numero di secondi passati da una data di riferimento alla data specificata nella funzione.

$time1 = mktime(0,0,0,$arrD1[1],$arrD1[0],$arrD1[2]);
$time2 = mktime(0,0,0,$arrD2[1],$arrD2[0],$arrD2[2]);

Questa funzione prende 6 parametri mktime(ora, minuto, secondo, mese, giorno, anno), per questo nelle nostre chiamate abbiamo passato prima tre 0 e poi $arrD2[1],$arrD2[0],$arrD2[2], infatti la funzione vuole mese e giorno invertiti rispetto a come li abbiamo passati a datediff.

A questo punto, visto che non sappiamo quale delle date passate è la maggiore facciamo un semplice controllo per avere sempre la differenza maggiore di 0:

$secDif = $time1-$time2;
if ($secDif<0) $secDif=$secDif*-1;

Ultimo passo è dividere il numero di secondi per il numero di secondi in un minuto (60), per il numero di minuti in un ora (60) e per il numero di ore in un giorno (24).
Arrotondiamo il risultato ottenuto e lo restituiamo.

$minDif =  $secDif / 60;
$hourDif = $minDif / 60;
$dayDif = $hourDif / 24;

return round($dayDif);