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
Luglio 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
Condividi

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.

9 Commenti

  1. domenico mercoledì 8 aprile 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 mercoledì 8 aprile 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 domenica 29 gennaio 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 domenica 29 gennaio 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 lunedì 30 gennaio 2017 alle ore 12.09

    ti ringrazio michele.

    Rispondi a questo commento
  5. Andrea Scarpa venerdì 17 febbraio 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 venerdì 17 febbraio 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 venerdì 17 febbraio 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

Scrivi un Commento

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

Articoli e Argomenti correlati

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

Ciao stefy,
la tua domanda non è proprio pertinente a questo articolo... ti consiglio di dare …

stefy

salve. ho un problema sulla pagina facebook..non riesco a unirla..mi dice che è in sospeso …

Michele

Ciao Antonio,
ma il tuo apk si chiama 'HelloWorld-release-unsigned.apk'?

Antonio

Grazie michele per la velocità con cui hai risposto, comunque ho seguito la tua guida passo per …