Capita spesso la necessità di dover calcolare il lasso di tempo che intercorre tra due date. Nell'esempio preso in considerazione in questo articolo l'ordine di tale differenza temporale è espresso in giorni. Ci sono diverse funzioni che si possono reperire in rete e che bene o male danno il risultato reale anche se in particolari condizioni possono fallire o non essere del tutto accurate.
Il codice proposto è frutto di una lunga ricerca e selezione tra le varie soluzioni testate nel tempo, il cuore del calcolo è dato dalla seguente funzione che accetta in entrata due parametri, rispettivamente l'oggetto della data iniziale e quello della data finale:
var _MS_PER_DAY = 1000 * 60 * 60 * 24;
// a e b sono oggetti Data
function dateDiffInDays(a, b) {
// Esclude l'ora ed il fuso orario
var utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
var utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
return Math.floor((utc2 - utc1) / _MS_PER_DAY);
}
Nel codice di cui sopra salta all'occhio l'utilizzo della funzione Date.UTC che restituisce il numero di millisecondi che intercorrono tra la mezzanotte dell'1 gennaio 1970 e la data da noi fornita. UTC è l'acronimo di Coordinated Universal Time e rappresenta il fuso orario di riferimento da cui sono calcolati tutti gli altri fusi orari del mondo così da poter rappresentare uno standard.
Nel tab "Result" dell'esempio di seguito potete apprezzarne l'effetto dal vivo e testarne l'effettivo funzionamento grazie ad un codice completo dove ho appositamente implementato la funzione oggetto di questa discussione.
volendolo fare con i giorni dei mesi tutti a 30??
anno a 360 giorni???
Ciao Domenico, non so se esistano in questo caso delle soluzioni pronte tuttavia opterei per una via alternativa creando una funzione ad hoc che si basi appunto sulla costanza del numero dei giorni.
Ti faccio un esempio concettuale di come affronterei la questione e facendo due test veloci posso assicurarti che funziona, quindi basta convertirla in una funzione in Javascript:
Data A: 27/10/2015
Data B: 02/03/2016
Calcoli la differenza tra gli anni e la moltiplichi per 12 in modo da recuperare il numero di mesi che vi intercorrono. Se l'anno è lo stesso il valore sarà 0, in questo caso invece è 12 = (2016-2015)x12.
Il valore risultante lo sommi al numero dei mesi della data B. Nel caso specifico: 12+3 = 15.
Sottrai questo valore al numero dei mesi della data A: 15-10 = 5.
Considerando che tutti i mesi sono di 30 giorni il valore in giorni del valore ottenuto sarà 5x30 = 150.
A questo punto passi alla parte relativa ai giorni sottraendo i giorni della data B a quelli della data A: 02-27= -25.
Infine ottieni i giorni di differenza tra le due date sommando i relativi valori ottenuti: 150 + (-25) = 125.
E' più facile a farsi che a dirsi, ho provato anche con un altro range di date e confermo l'efficacia del metodo.
Ciao Michele, vorrei che mi fosse restituito il numero del giorno dell'anno in base ad una data scelta da me. Per inciso il 02/01/2017 mi restituisce 2 il 25/01/2018 restituisce 25. grazie
Ciao andrea,
sicuramente puoi farlo con metodi meno fini ossia trattando la data come una stringa e recuperando i caratteri del giorno in base alla posizione (sapendo che, come nel caso delle date di esempio che hai inserito, le prime due posizioni definiscono il giorno, la terza è il separatore, la quarta e quinta il mese, la sesta il separatore e le ultime 4 l'anno).
In alternativa ci sono delle funzioni Javascript ad hoc, ad esempio:
var data = new Date("2017/01/29");
giorno = data.getDate();
La variabile "giorno" avrà come valore 29.
ti ringrazio michele.
Di niente andrea.
Per la gestione delle date Javascript offre nativamente diverse funzioni utili pronte all'uso.
Ciao Michele,
a me non funziona completamente,
se metto una data di un mese e una data di un altro mese il risultato non è corretto,
per esempio tra una data di febbraio e una di marzo
Ho paura che questo algoritmo calcoli che i mesi siano tutti di 31 giorni
Ciao Andrea,
ho fatto delle prove e funziona tutto correttamente, secondo me stai sbagliando qualcosa, puoi provare direttamente lo script che si trova incluso a fine articolo.
Di seguito il test che ho fatto:
Selezionando 2012 1 15 e 2012 2 15 il risultato è 31.
Selezionando 2012 2 15 e 2012 3 15 il risultato è 29.
Selezionando 2012 4 15 e 2012 5 15 il risultato è 30.
Fammi sapere se il problema lato tuo persiste che eventualmente vediamo di capire dove si trova e come risolverlo.
Ciao Michele, se volessi visualizzare anche la difeerenza in giorni, mesi e anni?
Ciao Alessio,
considerando che il risultato della funzione è in giorni, se dividi tale risultato per 30,4 (la media di giorni in un mese) ottieni il numero di mesi, se invece dividi il risultato per 365 ottieni il numero di anni.