MICHELEPISANI.IT
 

Funzione per calcolare la differenza in giorni tra due date

Calcolare la differenza tra due date

javascript - calcolare la differenza in giorni tra due date
July 04
07:042014

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.

Tags

Autore

Michele Pisani

Michele Pisani

Ho uno spiccato orientamento al problem-solving, se è troppo facile non mi diverto :)
Credo nella volontà e nel cambiamento perchè hanno fatto della mia passione il mio pane quotidiano.
Se devo descrivermi con una sola parola direi... "Concretezza", la mia stretta di mano è una garanzia.

11 Commenti

  1. domenico Wednesday, April 8, 2015 alle ore 13:07

    volendolo fare con i giorni dei mesi tutti a 30??
    anno a 360 giorni???

    Rispondi a questo commento
  2. Michele PisaniAutore Wednesday, April 8, 2015 alle ore 14:10

    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.

    Rispondi a questo commento
  3. andrea Sunday, January 29, 2017 alle ore 12:52

    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

    Rispondi a questo commento
    • Michele PisaniAutore Sunday, January 29, 2017 alle ore 22:40

      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.

      Rispondi a questo commento
  4. andrea Monday, January 30, 2017 alle ore 12:09

    ti ringrazio michele.

    Rispondi a questo commento
  5. Andrea Scarpa Friday, February 17, 2017 alle ore 12:06

    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

    Rispondi a questo commento
    • Andrea Friday, February 17, 2017 alle ore 12:28

      Ho paura che questo algoritmo calcoli che i mesi siano tutti di 31 giorni

      Rispondi a questo commento
    • Michele PisaniAutore Friday, February 17, 2017 alle ore 13:50

      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.

      Rispondi a questo commento
  6. Alessio Maggio Tuesday, June 23, 2020 alle ore 18:18

    Ciao Michele, se volessi visualizzare anche la difeerenza in giorni, mesi e anni?

    Rispondi a questo commento
    • Michele PisaniAutore Tuesday, June 23, 2020 alle ore 22:56

      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.

      Rispondi a questo commento

Scrivi un Commento

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

Articoli e Argomenti correlati

Il Canale YouTube in ITALIANO

1 VIDEO GRATIS ogni 2 settimane! ISCRIVITI!

Entra a far parte della community su Facebook

Categorie popolari

Iscriviti alla mia newsletter

La tua e-mail con me sarà al sicuro.
Non fornirò mai le tue informazioni a nessuno!

Ultimi commenti

Michele Pisani

Hai verificato se succede per tutte le pagine da un certo periodo di tempo in poi o solo su alcune?

Tecnowiz

Sono amministratore di un blog pure io... Intanto ti faccio i complimenti per questo articolo. …

Michele Pisani

Ciao Antonio, grazie per la fiducia :) In caso di più fogli è necessario inserire il codice del …

Antonio

Ciao Michele, ho acquistato il tuo libro che unitamente ai tuoi video sta diventando il mio corso …