2012-01-09 55 views
2

我在写一个简单的函数来验证日期。问题是,开关操作符似乎不匹配任何东西,maxDay的值仍然为0.如果我使用if语句,我没有任何问题。使用开关命令进行日期验证不起作用

function validateDateFormat(day,month,year) { 
    alert(month); // this was to ensure month was correct and it is!! 
    var maxDay = 0; 
    switch(month) 
    { 
     case 01 :  
     case 03 : 
     case 05 : 
     case 07 : 
     case 08 : 
     case 10 : 
     case 12 : maxDay = 31; break; 
     case 04 : 
     case 06 : 
     case 09 : 
     case 11 : maxDay = 30; break; 
     case 02 : if(year%4 == 0) maxDay = 29; 
       else maxDay = 28; 
       break;  
     //default : return " Invalid month -"; break;  
    } 
    alert(maxDay); 
    if(day > maxDay) {return " Invalid day -";} 
    return "";  
} 
+1

闰年实际上并不是每隔4年发生一次。鉴于你的应用程序的生命和日期,你将会验证这可能不重要。只是想你可能想知道他们在400年的周期中工作,所以闰年之间偶尔会有8年的差距。见[为什么使用闰年](http://www.timeanddate.com/date/leapyear.html) – Jonathan 2012-01-09 19:20:27

+0

它在Firebug中对我来说工作得很好。 – 2012-01-09 19:21:57

回答

0

你不应该用0前缀你的号码;导致数字文字被解释为八进制。由于08不是有效的八进制数,因此脚本可能会生成运行时错误。

+0

你甚至尝试过吗?这不是问题。 – 2012-01-09 19:22:40

+0

它似乎在为我工作。由于它不适合你,我想你可能使用的浏览器不能像处理JS那样的语法错误。 – Jacob 2012-01-09 19:25:49

+0

或者你传递给函数的内容是不同的。您应该将其添加到您的帖子中。 – Jacob 2012-01-09 19:26:19

2

我强烈怀疑根本问题是您提供的字符串作为validateDateFormat的参数。如果是这样,则使用if时的行为肯定会不同于使用switch时的行为。例如,假设你要这样写:

var num = "9"; 
if (num == 9) 
    alert("true"); 

这将提醒true因为==(双等号)在进行比较之前触发num字符串胁迫的数字。然而,这将提醒什么:

var num = "9"; 
switch(num) { 
    case 9: 
     alert("true"); 
     break; 
} 

...因为switch使用了更严格的===(三等于)运算符,它不执行类型强制。

然而,这确实警报true

var num = "9"; 
switch(num) { 
    case "9": // string 
     alert("true"); 
     break; 
} 

...因为我们现在比较字符串。

因此,要修复您的代码,您需要传递实际数字,或修改函数以比较字符串。

注意:switch行为在section 12.11 of the ECMAScript spec涵盖。

+0

谢谢我刚刚意识到这一点。我输入一个表单字符串,而不是整数值。非常感谢,我猜想初学者错误...呃,尽管我是。谢谢 – 2012-01-09 19:45:08

+0

@PatrickBouche你应该接受答案,如果它满足你的问题 – Jonathan 2012-01-09 20:48:35