我有一个看似无助的问题,我确信我错过了一些非常愚蠢的东西。 我有以下Javascript函数来验证日期:
function validateDate(date){
var re = /\b\d{1,2}[\/-]\d{1,2}[\/-]\d{4}\b/;
if(!re.test(date))
return false;
var separator = (date.indexOf("/") != -1) ? "/" : "-";
var aux = date.split(separator);
var day = parseInt(aux[0]);
var month = parseInt(aux[1]);
var year = parseInt(aux[2]);
alert(aux[0]+" "+aux[1]+" "+aux[2]);
var dateTest = new Date(year,month-1,day);
alert(dateTest); //2nd alert
if(dateTest.getDate() != day)
return false;
if(dateTest.getMonth()+1!= month)
return false;
if(dateTest.getFullYear() != year)
return false;
return true;
}
第一个警报始终显示正确的值。
如果传入的日期是例如05/07/2011
,一切正常。第二个警报显示"Tue Jul 5 00:00:00 UTC+0200 2011"
是正确的。
但现在,如果我将日期月更改为8月或9月,则创建日期是错误的。例如,对于日期05/08/2011
,第二个提醒将显示"Sun Dec 5 00:00:00 UTC+0100 2010"
。
答案 0 :(得分:5)
确保为parseInt
提供基数。如果不这样做,它将根据字符串“猜测”。在这种情况下,由于前缀为零,您的08
被解析为八进制值,然后返回0
。
var day = parseInt(aux[0], 10);
var month = parseInt(aux[1], 10);
var year = parseInt(aux[2], 10);
提供十个基数会得到正确的结果。
//Parsing numbers:
parseInt("06"); // 6, valid octal
parseInt("07"); // 7, valid octal
parseInt("08"); // 0, invalid octal
parseInt("09"); // 0, invalid octal
parseInt("10"); // 10, parsed as decimal
parseInt("11"); // 11, parsed as decimal
parseInt("12"); // 12, parsed as decimal