Script javascript: Calcolare differenza in giorni tra due date

   difficoltà:  script script script script script

Script simili
13/10/2008


Può essere utile in un form di prenotazione online, dove si da la possibilità all'utente di scegliere data di inizio e data fine, dover controllare che il periodo selezionato non superi un numero di giorni scelto dall'amministratore. Vedremo come creare la funzione che data la data di inizio e di fine calcoli la differenza in giorni tra le due date.

Per il controllo dei dati inseriti utilizzeremo altri controlli che abbiamo visto in altri script:
Script javascript: Controllo validità formato ed esistenza data
per controllare che le date inserite siano nel corretto formato gg/mm/aaaa

Script javascript: Confrontare due date
per controllare che la data di inizio sia precedente a quella di fine

<script>
function giorni_differenza(data1,data2){
if(!controllo_data(data1) || !controllo_data(data2)){
alert('Inserire le date nel formato gg/mm/aaaa');
return -1;
}

if(!confronta_data(data1,data2)){
alert('La data di inizio deve essere precedente quella di fine');
return -1;
}

anno1 = parseInt(data1.substr(6),10);
mese1 = parseInt(data1.substr(3, 2),10);
giorno1 = parseInt(data1.substr(0, 2),10);

anno2 = parseInt(data2.substr(6),10);
mese2 = parseInt(data2.substr(3, 2),10);
giorno2 = parseInt(data2.substr(0, 2),10);

var dataok1=new Date(anno1, mese1-1, giorno1);
var dataok2=new Date(anno2, mese2-1, giorno2);

differenza = dataok2-dataok1;
giorni_differenza = new String(differenza/86400000);

alert(giorni_differenza+' giorni di differenza');
return giorni_differenza;
}
</script>

richiameremo la funzione cosi:
<script>
giorni_differenza("14/11/1990","13/11/1990");
</script>

Cosa fa la funzione?

Inizialmente controlla, richiamando la funzione controllo_data, che il formato delle due date sia gg/mm/aaaa [vedi funzione controllo_data]
<script>
if(!confronta_data(data1,data2)){
alert('La data di inizio deve essere precedente quella di fine');
return -1;
}
</script>

Poi preleva per entrambe le date il valore di giorno, mese, anno e le trasforma con la funzione Date in date nel formato riconoscibile da javascript:
<script>
var dataok1=new Date(anno1, mese1-1, giorno1);
</script>

La differenza di date in javascript restituisce la differenza in secondi. Per cui il risultato della differenza delle due date va diviso per 86400000 (i secondi in un giorno).

Vediamo ora un esempio completo con tutte le funzioni:
<script>
function controllo_data(stringa){
var espressione = /^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/;
if (!espressione.test(stringa))
{
return false;
}else{
anno = parseInt(stringa.substr(6),10);
mese = parseInt(stringa.substr(3, 2),10);
giorno = parseInt(stringa.substr(0, 2),10);

var data=new Date(anno, mese-1, giorno);
if(data.getFullYear()==anno && data.getMonth()+1==mese && data.getDate()==giorno){
return true;
}else{
return false;
}
}
}

function confronta_data(data1, data2){
data1str = data1.substr(6)+data1.substr(3, 2)+data1.substr(0, 2);
data2str = data2.substr(6)+data2.substr(3, 2)+data2.substr(0, 2);
if (data2str-data1str<0) {
return false;
}else{
return true;
}
}

function giorni_differenza(data1,data2){
if(!controllo_data(data1) || !controllo_data(data2)){
alert('Inserire le date nel formato gg/mm/aaaa');
return -1;
}

if(!confronta_data(data1,data2)){
alert('La data di inizio deve essere precedente quella di fine');
return -1;
}

anno1 = parseInt(data1.substr(6),10);
mese1 = parseInt(data1.substr(3, 2),10);
giorno1 = parseInt(data1.substr(0, 2),10);

anno2 = parseInt(data2.substr(6),10);
mese2 = parseInt(data2.substr(3, 2),10);
giorno2 = parseInt(data2.substr(0, 2),10);

var dataok1=new Date(anno1, mese1-1, giorno1);
var dataok2=new Date(anno2, mese2-1, giorno2);

differenza = dataok2-dataok1;
giorni_differenza = new String(differenza/86400000);

alert(giorni_differenza+' giorni di differenza');
return giorni_differenza;
}

giorni_differenza("10/11/1990","13/11/1990");
</script>





Commenti


  Davide

7/12/2008 16:20:55

peccato non ci sia una pagina o zona di esempio

  Daniele da Ischia

27/3/2009 15:52:48

C'è un piccolo errore di distrazione.

Qui:
if(!controllo_data(data1) && !controllo_data(data1)){

viene effettuato 2 volte il controllo su data1 mentre dovrebbe essere:

if(!controllo_data(data1) && !controllo_data(data2)){

Ciao!

  Marco

20/10/2009 8:59:23

L'esempio è fragile: durante i giorni di cambio ora (legale/solare) la giornata non è di 24 ore; dunque lo script non funziona correttamente.

  Jerry

4/7/2011 19:54:12

un altro bug:

if(!controllo_data(data1) && !controllo_data(data2))

Errore:
se data1 è corretto ed invece 'data2' no, il codice prosegue invece di fermarsi.

Perchè:
se 'data1' è corretto, controllo_data ritorna true e non viene effettuato il controllo della 'data2'

  Fabio

9/7/2011 14:14:37

@Jerry: Corretto Grazie



Lascia un commento


Codice di controllo*:
Nome*:
Email/Link:
Testo*:
 
I campi contrassegnati con * sono obbligatori.