2012-04-09 60 views
1

我有三個日期輸入字段 - 日,月,年。 一旦輸入,我應該驗證它。下面的代碼用於:如何驗證日期輸入到3個單獨的字段?

$('#test').click(function(event) { 
    var daySelector = "#dd", 
     monthSelector = "#mm", 
     yearSelector = "#yyyy"; 
    var day = $(daySelector).val() == "" ? 1 : parseInt($(daySelector).val(), 10); 
    var month = $(monthSelector).val() == "" ? 1 : parseInt($(monthSelector).val(), 10); 
    var year = parseInt($(yearSelector).val(), 10); 
    var date = new Date(year, month, day); 
    var result = !isNaN(date.getTime());  
}); 

但它接受(即返回true)等33/55/2000錯誤的值。我的錯誤在哪裏? Demo

我試過another approach - 它也不能正常工作。

+1

您可以使用||當空或空時,而不是三值運算符的默認值.. x = x || 1 ..不是你的答案,但更容易閱讀 – 2012-04-09 20:19:50

+0

http://stackoverflow.com/questions/3876448/javascript-month-and-day-and-year-check – zod 2012-04-09 20:23:30

+0

任何機會,你可以使用日曆或其他單個字段擡頭?用戶體驗3個單獨的日期字段留下了一些需要。 – Jordan 2012-04-09 20:24:36

回答

2

日期對象自動轉換溢出。

因此,如果你創建32.01.2000並有只有31天的月份,然後它會創建的對象與 2000年2月1日日期

你必須從改變你的驗證邏輯「楠」到更多的東西複雜的;)

需要注意的一點:)

date.getMonth()返回0-11 - > 0等於一月:P那是我在回答最初錯誤的來源。 而你似乎必須減少發送給Date構造函數的值。

+0

有趣..不知道。 – 2012-04-09 20:23:13

+0

@PatrickScott我也是,但我嘗試了不同的值,它似乎是這樣工作的:O只要在問題 – 2012-04-09 20:24:28

+0

提供的jsfiddle中嘗試它似乎我錯了因爲在2000年1月有31天:O – 2012-04-09 20:26:02

0

考慮現有的解決方案:

=========

UPD單從這些框架的一個拉出功能:

validateDay = function (day, year, month) { 
    var date = new Date(year, month, day); 
    return (date.getFullYear() === year && 
     date.getMonth() === month && 
     date.getDate() === day); 
};​ 
+0

重新您的更新 - 請參閱我的問題的結尾,我已經提到了另一種方法 - 這等於你已經給了。它不起作用,日期30-feb-2000被視爲有效。 – 2012-04-10 06:30:15

+0

@LA_也許你已經忘記了那個月份的索引開始隨着零。所以一月= 0,二月= 1(**不是2 **)再次檢查這一點**它的工作**罰款 – 2012-04-10 10:09:23