2011-11-11 22 views
36

可能重複:
Detecting an 「invalid date」 Date instance in JavaScriptJavaScript的檢測有效日期

我用的是以下檢測到有效日期:

var text = $('#Date').val(); 
var date = Date.parse(text); 

if (isNaN(date)) { 
     // Invalid date 
} 

卻發現Date.parse認爲以下是有效日期(mm/dd/yyyy)

  • 2011年2月30日
  • 2011年11月31日

任何其他方式來檢測無效的日期時的天數超過的 日在該月的總數是多少?

UPDATE:一個更大的問題是,jQuery驗證插件沒有任何檢測爲無效日期!

SOLUTION:

基於@ Guffa的意見,我已經創建了下面的函數來驗證日期:

function validDate(text) { 

    var date = Date.parse(text); 

    if (isNaN(date)) { 
     return false; 
    } 

    var comp = text.split('/'); 

    if (comp.length !== 3) { 
     return false; 
    } 

    var m = parseInt(comp[0], 10); 
    var d = parseInt(comp[1], 10); 
    var y = parseInt(comp[2], 10); 
    var date = new Date(y, m - 1, d); 
    return (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d); 
} 
+3

Date.parse認爲不是它們是正確的,但它會將它們轉換爲正確的日期。例如。 2011年2月30日將在投票結束後作爲'03/02/2011' – Andreas

+1

截止,我意識到提供的問題是*不*相同,儘管它是相關的。 – zzzzBov

+1

由於我需要在多個語言環境中支持輸入,因此我們實現了我們自己的日期解析器。我們發現檢測到這個錯誤的唯一方法是比較我們解析的月份字符串與生成日期的月份 –

回答

72

要檢查日期是否有效,可以解析日期的組件,並根據它創建一個Date對象,並檢查數據中的組件是否與解析的組件相同。如果您從超出範圍的成分創建對象Date,則這些值將流向下一個/上一個句點以創建有效日期。

例如,new Date(2011,0,42)將創建包含日期2011年2月11日,而不是1/42/2011的對象。

通過解析,而不是完整的日期,你也將獲得與周圍不同的日期格式問題的組件。例如,我的瀏覽器會預期日期格式爲y-m-d而不是d/m/y

例子:

var text = '2/30/2011'; 
var comp = text.split('/'); 
var m = parseInt(comp[0], 10); 
var d = parseInt(comp[1], 10); 
var y = parseInt(comp[2], 10); 
var date = new Date(y,m-1,d); 
if (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d) { 
    alert('Valid date'); 
} else { 
    alert('Invalid date'); 
} 

演示:http://jsfiddle.net/Guffa/UeQAK/

+1

這很好用!除了你需要將date.getDay()更改爲date.getDate()。 –

+1

這裏是更新的演示:http://jsfiddle.net/zKb6c/ –

+0

@NickOlsen:謝謝,更新了答案。 – Guffa

3

如果你的日期格式固定爲M/D/YYYY,你可以重新格式解析日期和看看它是否與輸入相匹配:

var d = new Date(Date.parse(str)) 
return str === (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getYear(); 

但是,這不會容忍空白或零填充數字。

如果您不需要保留用戶的輸入準確,你可以只格式化日期無論如何,假裝是他們鍵入的內容。

但是,如果你不能這樣做,我會使用RegExp自己解析組件,然後將它們與Date方法中的值進行比較。

0

你可以寫一個腳本來手動執行此操作:

function checkDate(day, month) { 
    if ((month == 4 || month == 6 || month == 9 || month == 11) && day < 30) { 
     alert("Date is valid") 
    } 
    else if (month == 2 && day <= 28) { 
     alert("Date is valid") 
    } 
    else if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day <= 31) { 
     alert("Date is valid") 
    } 
    else { 
     alert("Date is in-valid") 
    } 
} 

當然,你還需要什麼東西看出來的飛躍年,但請記住,除非4年中的前兩位數可以被4整除,否則任何一年可以被4整除的年份都是閏年。這應該很容易包括在內功能。

+2

在語句'=='不是'='? – user1575921

0

的例子是錯誤的

正確的是

if ((month == 4 || month == 6 || month == 9 || month == 11) && day <= 30) 

<=而不是=

但這個例子是偉大的!