2016-02-12 85 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>'));