2012-01-09 45 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