JavaScript检测有效date

可能重复:
在JavaScript中检测“无效date”date实例

我正在使用以下来检测一个有效的date:

var text = $('#Date').val(); var date = Date.parse(text); if (isNaN(date)) { // Invalid date } 

但是发现Date.parse认为以下是有效的date(mm / dd / yyyy)

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

当天数超过当月的总天数时,是否有其他方法来检测无效date?

更新:一个更大的问题是,jQueryvalidation插件没有检测到这是一个无效的date!

解:

基于@ Guffa的评论,我创build了以下函数来validationdate:

 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); } 

要检查date是否有效,可以parsingdate的组件,从中创buildDate对象,并检查数据中的组件是否与parsing的组件相同。 如果您从超出范围的成分中创buildDate对象,则这些值将stream向下一个/上一个句点以创build有效date。

例如, new Date(2011,0,42)将创build一个包含date2011年2月11日而不是2011年4月42日的对象。

通过parsing组件而不是完整的date,你也可以解决不同date格式的问题。 我的浏览器将例如期望像ymd而不是d/m/y这样的date格式。

例:

 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/

如果您的date格式固定为M/D/YYYY ,则可以重新格式化parsing的date,并查看它是否与input相匹配:

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

但是,这不会容忍空白或零填充的数字。

如果你不需要精确地保持用户的input,那么你可以重新格式化date,并假装是他们input的内容。

但是,如果你不能这样做,我会使用RegExp自己parsing组件,然后将它们与Date方法中的值进行比较。

你可以编写一个脚本来手动执行此操作:

 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整除的年份都是闰年。这应该很容易包括在这个function中。

这个例子是错误的

正确的是

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

<=而不是=

但是这个例子太棒了!