Mi sono trovato nella necessità di dover calcolare la differenza tra due date, due orari, ecc…

Volendo automatizzare la procedura, ho creato questa funzione in PHP che restituisce la differenza tra due date impostate.

le variabili della funzione, sono 3:

  • $data_iniziale: ovvero la data dalla quale si vuole partire a fare il conteggio. Il campo deve essere formattato come: “aaaa-mm-gg hh:mm:ss” (ovverto il timestamp) oppure come “aaaa-mm-gg” (ovvero il formato date).
  • $data_finale: ovvero la data termine del conteggio. Il campo deve essere formattato come: “aaaa-mm-gg hh:mm:ss” (ovverto il timestamp) oppure come “aaaa-mm-gg” (ovvero il formato date).
  • $unita: accetta una variabile (minuscola) composta da un carattere:
    • m: se la funzione deve riportare i minuti trascorsi tra le due date;
    • h: se la funzione deve riportare le ore trascorse tra le due date;
    • g: se la funzione deve riportare i giorni trascorsi tra le due date;
    • a: se la funzione deve riportare gli anni trascorsi tra le due date.

La funzione da scrivere nella pagina php è la seguente:

<?php 

function delta_tempo ($data_iniziale,$data_finale,$unita) {

 $data1 = strtotime($data_iniziale);
 $data2 = strtotime($data_finale);

	switch($unita) {
		case "m": $unita = 1/60; break; 	//MINUTI
		case "h": $unita = 1; break;		//ORE
		case "g": $unita = 24; break;		//GIORNI
		case "a": $unita = 8760; break;         //ANNI
	}

 $differenza = (($data2-$data1)/3600)/$unita;
 return $differenza;
}
?>

Se volessimo cercare la differenza, in anni, tra il 22 settembre 1981 e oggi (05 ottobre 2013), la nostra funzione andrebbe richiamata in questo modo:

<?php
   echo delta_tempo("1981-09-22", "2013-10-05", "a");
?>

Niente di più semplice.

Felice di esservi stato utile!






7 commenti

Samuele · 1 Settembre 2014 alle 09:17

Non funziona correttamente, restituisce risultati sbagliati se mostro la differenza in anni: se faccio 2014-09-01 00:00:00 e 2014-09-01 00:00:00 mi restituisce 25.016438356164 invece dovrebbe essere 25.0 tondo.
Va modulato lo script.

    francesco chioidn · 10 Giugno 2015 alle 11:04

    Ciao ,
    mi permetto di aggiungere che basta fare un arrotondamento per eccesso con la funzione floor() di php.

    return floor($differenza);

    Ciao Francesco

    public static function delta_tempo($data_iniziale,$data_finale,$unita)
    {
    $data1 = strtotime($data_iniziale);
    $data2 = strtotime($data_finale);

    switch($unita) {
    case “m”: $unita = 1/60; break; //MINUTI
    case “h”: $unita = 1; break; //ORE
    case “g”: $unita = 24; break; //GIORNI
    case “a”: $unita = 8760; break; //ANNI
    }

    $differenza = (($data2-$data1)/3600)/$unita;
    return floor($differenza);
    }

daniele · 2 Dicembre 2015 alle 10:22

Grazie per la condivisione mi sta tornando utile.

oscar · 4 Dicembre 2015 alle 09:29

ciao luca, mi sembra che nel tuo script non sia presso in considerazione gli anni bisestili o sono io che non lo vedo. Scusa se sbaglio banalmente, sono solo all’inizio dello studio della programmazione. Grazie.

    Luca · 7 Dicembre 2015 alle 17:17

    Tranquillo, ci pensa a tutto il comando strtotime() in quanto converte il dato in un timestamp UNIX.

Samuele Martini · 28 Aprile 2016 alle 15:42

Questo metodo fa un giro assurdo che non tiene conto affatto degli anni bisestili e dell’ora legale, infatti anche se si usa l’strtotime, questa funzione si limita a calcolare il numero di secondi trascorsi dal 1/1/1970 alla data che gli viene passata. Dividendo (ad esempio) per 8760 non viene sempre il numero corretto di anni perché non tutti gli anni durano 8760 ore a causa dei bisestili, mentre l’strtotime delle 24 ore in più ne ha tenuto conto..

per calcolare la differenza bastano 4 righe di codice, che tengono già conto di tutti gli attori in scena (anni bisestili, ore legali, ore solari, secondo intercalare, eccetera):

$datetime1 = new DateTime(“now”);
$datetime2 = new DateTime(“data che si vuole”);
$interval = $datetime1->diff($datetime2);
return $interval->format(“formato”);

dove “formato” va sostituito con il formato che desiderate (giorni, minuti, anni, ore), ad esempio “%y” per il numero di anni

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Utilizzando il sito, accetti l'utilizzo dei cookie di profilazione e di terze parti da parte nostra. Maggiori informazioni.

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi