Javascript: setDate() non funziona! Differenza tra date

Voglio condividere la risoluzione di un problema che mi si è presentato con l'uso dell'oggetto Date() di Javascript.

Dovendo controllare che due date non fossero a più di 7 giorni di distanza l'una dall'altra ho pensato bene di utilizzare l'oggetto Date() ed il relativo metodo setDate().

Pagina w3cschool del 07.10.2010In soldoni, prese data1 e data2 e assumendo che esse siano crescenti cronologicamente ho necessità di sapere se esse si distanziano per più di 7 giorni.

Come suggerito in più "punti" del web, perfino dall'autorevole w3schools (come dimostra lo screenshot del 7 ottobre 2010), per incrementare una data di N giorni basta inserire +N all'interno del setDate.

Questa cosa è più facile spiegarla fornendo il codice:

 

ok? tutto bene…

fate una prova e funziona tutto… giusto?

Si, in effetti la cosa funziona bene quando dobbiamo aggiungere 5 giorni (seguo l'esempio) alla data corrente (oggi), ma se dobbiamo creare una data sulla base di una data passata?

Mi spiego meglio:

mettiamo che il nostro myDate dell'esempio non sia la data corrente, ma una data del passato (12 agosto 1991) e  che vogliamo creare una nuova data, 5 giorni più vecchia di myDate, nell'esempio myOffsetDate questo è quello che saremmo portati a fare:

 

quello che mi aspetto è che la mia variabile myOffsetDate, diventi uguale a myDate +5 giorni, ovvero 17 agosto 1991, ma quello che succede è tutt'altro! Oggi, 7 ottobre 2010, myOffsetDate diventerebbe 17 ottobre 2010! Oggi 20 dicembre 2010, myOffsetDate diventerebbe 17 dicembre 2010!

In pratica il comando setDate aggiunge 5 giorni a myDate e li assegna a myOffsetDate, ma ignorando completamente il mese e l'anno che così rimangono quelli dell'inizializzazione ( new Date(); ).

Allora come facciamo a risolvere questo drammatico problema? Semplicemente utilizzando altri metodi che vengono in nostro soccorso: setMonth() e setFullYear().

Soluzione!

Tornando al problema originariamente posto, volendo verificare se due date siano sfasate per più di 7 giorni potremmo scrivere:

 

Grazie ai metodi setMonth() e setFullYear() riusciamo ad ottenere il risultato sperato.

Spero di essere stato sufficientemente esaustivo e soprattutto utile a quanti si trovino ad affrontare questo problema.