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)
<=
而不是=
但是这个例子太棒了!