Newsgroup: it.comp.lang.javascript
Titolo: problemi con la validazione della data

Utilizzo questo script per
1) validare una data;
2) sommare alla data i giorni indicati su un controllo meno 1;
3) far apparire il risultato su un terzo controllo.
function dataValida(txt){
	var re = /^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/;
	if(re.test(txt)){
		var adata = txt.split('/');
		var gg = parseInt(adata[0]);
		var mm = parseInt(adata[1]);
		var aaaa = parseInt(adata[2]);
		var xdata = new Date(aaaa, mm-1, gg)
		if((xdata.getFullYear()==aaaa) && (xdata.getMonth()==mm-1) &&
(xdata.getDate()==gg))
			return xdata
		else return false
	}else return false
}
function Aggiungi(strData,giorni){
	if(dataValida(strData)){
		data = dataValida(strData)
	if(giorni){
		data.setDate(data.getDate()+parseInt(giorni)-1)
		}
		return data.getDate()+'/'+(data.getMonth()+1)+'/'+data.getFullYear()
	}else{
		alert('Inserire una data valida')
		return ''
	}
}
<input type= "TEXT" name="inizioL" size="15" VALUE="<%=rs("inizioL")
%>" onchange="this.form.datafineeff.value=Aggiungi
(this.value,this.form.durata.value)">
Ora la cosa strana è che, se inserisco come giorni o come mese 08 o 09
mi restituisce alert. Con tutte le altre date è OK.
Potete darmi una mano, non sono molto esperto.

 mi restituisce alert. Con tutte le altre date č OK.
Sě, questo mi sembra strano: 08/08/0808 dovrebbe accettartela ... "con
tutte le altre date č OK" mi sembra altrettanto strano: p.e. dovrebbe
accettarti anche 91/91/9191 ... ... ...
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

Va bene lasciamo perdere regexp.
Il problema è che l'IF mi restituisce false se il giorno o il mese è
08 o 09. Con tutti gli altri giorni o mesi è ok.
Ho provato anche questa validazione. Stesso risultato utilizzando sia
Firefox che Explorer 6 sp2.
Che sia un errore del sistema operativo (l'ho controllato solo su un
pc)
function ControllaData(txt)
{
		var adata = txt.split('/');
		var giorno = parseInt(adata[0]);
		var mese = parseInt(adata[1]);
		var anno = parseInt(adata[2]);
    mese = mese - 1;
    var tempDate = new Date(anno,mese,giorno);
    if((tempDate.getFullYear() == anno) && (tempDate.getMonth() ==
mese) && (tempDate.getDate() == giorno))
    {
	    return tempDate
	    }
    else
    {
    return false;
    }
}

 		var giorno = parseInt(adata[0]);
Eh eh ... la prima volta che mi è capitato con dei codici prodotto che
iniziano con lo zero (es. codice 01232) sono diventato matto a capire il
perché ... poi ho scoperto che basta leggersi la reference!
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functions/parseInt
(riassunto: se inizia con lo zero stai lavorando a base 8 anziché 10 ...
devi esplicitare la radice con parseInt)
-- 
"qualcuno è andato per età
 qualcuno perchè già dottore
 e insegue una maturità, si è sposato, fa carriera
 ed è una morte un po' peggiore"
									    F.G.

 Va bene lasciamo perdere regexp.
Scusate se mi inserisco, magari do un contributo! Almeno lo spero!
Partendo dal dato di fatto che una data sbagliata viene comunque 
"convertita", per esempio questo: 
alert(new Date("2009/02/29") + "\r\n" + new Date("2009/13/44"));
restituisce:
Sun Mar 01 2009 00:00:00 GMT... ecc.
Sat Feb 13 2010 00:00:00 GMT... ecc.
si può confrontare la data inserita con la stessa data "convertita":
<html>
<head>
</head>
<body>
<SCRIPT type=text/javascript>
// La data inserita da verificare:
Data = "29/02/2009";
// Trasforma in *date* (-> yyyy/mm/dd):
Data0 = Data.split(/\D/).reverse().join("/");
// Verifica se la data è nel *range* impostato:
OK = "2000/01/01" <= Data0 && Data0 <= "2010/12/12";
// Legge la data inserita 'trasformata':
Data1 = new Date(Data0);
// alert(Data1); // (2009/02/29) Risponde:
// Sun Mar 01 2009 00:00:00 GMT... ecc.
// Legge il giorno della data inserita:
DtDay = Data1.getDate();
// aggiunge uno '0' ai giorni da 1 a 9)
if (DtDay < 10) DtDay = "0" + DtDay;
// Legge il mese della data inserita:
DtMonth = Data1.getMonth() + 1;
// aggiunge uno '0' ai mesi da 1 a 9)
if (DtMonth < 10) DtMonth = "0" + DtMonth;
// Legge l'anno della data inserita:
DtYear = Data1.getFullYear();
// Ricompone la data:
Data2 = DtDay + "/" + DtMonth + "/" + DtYear;
// Presenta la risposta:
if (Data==Data2 && OK) {
alert("Data O.K.");
} else {
alert(Data+": Data non valida!\r\nInserisci una data "+
"valida \r\ntra 01/10/2000 e 12/12/2010");
}
</SCRIPT>
^__^
</body>
</html>
-- 
Saluti
Renato
 

 TP/BP/Delphi/jscr/&c, FAQ items, links.

 devi esplicitare la radice con parseInt)
Giusto. Ho Modificato il codice in questo modo e tutto fila liscio.
var giorno = parseInt(adata[0],10);
var mese = parseInt(adata[1],10);
var anno = parseInt(adata[2],10);
Grazie

 Scusate se mi inserisco, magari do un contributo! Almeno lo spero!
Ma vieni! :-) Mi sei stato molto utile[1], ti ringrazio.
Niente che riguardi le date, ma questa riga:
Data.split(/\D/).reverse().join("/");
mi è servita per sostituire una regexp "esagerata
A tal proposito, sarebbe opportuno che modificassi lo script, perché se
viene inserito un carattere diverso da "/", quello non viene splittato
generando un errore.
Questo lo evita:
// La data inserita da verificare:
Data = "29:02::2009";
// Sostituisce il/i font di separazione con "/"
nData = Data.replace(/\D+/g,"/");
// Trasforma in *date* (-> yyyy/mm/dd):
Data0 = nData.split("/").reverse().join("/");
cambiando poi i vari "Data" che seguono, in "nData".
    ...skipped!
[1] - Qui sotto puoi vedere come l'ho utilizzato. :-D
]1[ - iuQ ottos ioup eredev emoc oh'l otazzilitu. D-:
-- 
    * b *
  *   y   *
*   Piero   *
[ /deus ex machina/ ] 

 - FAQish topics, acronyms, & links.
 Proper <= 4-line sig. separator as above, a line exactly "-- " (SonOfRFC1036)
 Do not Mail News to me. Before a reply, quote with ">" or "> " (SonOfRFC1036)