2016-02-12 173 views
2

我指的是link,因爲我沒有50個聲望我不允許在發佈此問題的答案中發表評論。我沒有得到你可以看到一個月從幾個月減去的聲明。這可能很簡單,但任何人都可以澄清這一點?在javascript中驗證月份的日期

var m = matches 1 - 1; ?

function isValidDate(date) 
{ 
    var matches = /^(\d{2})[-\/](\d{2})[-\/](\d{4})$/.exec(date); 
    if (matches == null) return false; 
    var d = matches[2]; 
    var m = matches[1] - 1; 
    var y = matches[3]; 
    var composedDate = new Date(y, m, d); 
    return composedDate.getDate() == d && 
      composedDate.getMonth() == m && 
      composedDate.getFullYear() == y; 
} 
+1

的[使用Javascript可能重複:如何驗證日期格式MM-DD-YYYY?](http://stackoverflow.com/questions/276479/javascript-how-to-validate-dates-in-format-mm-dd-yyyy) – akashchandrakar

+0

嗨aksam,我有已經提到了這個問題的鏈接,並說明了我不得不發佈這個問題的原因。 – Ashish

回答

1

變種米= matches1 - 1; ?

months指數從0

所以開始時你認爲是揚1,它實際上是0當你做date.getMonth()

這就是爲什麼當您從日期字符串中獲得1時,您需要在將它設置爲日期對象之前將其設置爲0

+0

好的。它不適用於日期嗎? – Ashish

+1

@Ashish不,日期和年份值是一樣的。 – gurvinder372

+0

好的。謝謝。現在明白了。 – Ashish

0

在問題的最尖端,驗證功能是過度的。只有月份需要檢查,因爲如果日期或月份超出範圍,生成日期的月份將會改變。

另外的正則表達式可以被大大簡化,考慮(假設輸入特有美國米/ d/Y格式):

/* Validate a date string in US m/d/y format 
 
** @param {string} s - string to parse 
 
**      separator can be any non–digit character (.-/ are common) 
 
**      leading zeros on values are optional 
 
** @returns {boolean} true if string is a valid date, false otherwise 
 
*/ 
 
function validateMDY(s) { 
 
    var b = s.split(/\D/); 
 
    var d = new Date(b[2],--b[0],b[1]); 
 
    return b[0] == d.getMonth(); 
 
} 
 

 
var testData = ['2/29/2016', // Valid - leap year 
 
       '2/29/2015', // Invalid - day out of range 
 
       '13/4/2016', // Invalid - month out of range 
 
       '13/40/2016', // Invalid - month and day out of range 
 
       '02/02/2017']; // Valid 
 

 
document.write(testData.map(function(a) { 
 
    return a + ': ' + validateMDY(a); 
 
}).join('<br>'));