2012-03-29 69 views
3

我有一个似乎很无意义的问题,我确信我错过了一些非常愚蠢的事情。 我有以下的JavaScript函数验证日期:用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"这是正确的。 但现在,如果我将日期月份更改为八月或九月,则创建日期错误。例如,与日期05/08/2011,第二个警报将显示"Sun Dec 5 00:00:00 UTC+0100 2010"

任何人都知道会发生什么?

+0

你从哪里得到你的约会?它是用户输入吗?这是一个文件吗?如果是用户输入,使用日期小部件会不会更好? – T9b 2012-03-29 11:03:30

回答

5

确保您提供的基数为parseInt。如果你不这样做,它会根据字符串“猜测”。在这种情况下,您的08由于前缀为零而被解析为八进制值,并返回0

var day = parseInt(aux[0], 10); 
var month = parseInt(aux[1], 10); 
var year = parseInt(aux[2], 10); 

提供一个基数为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