Javascript Date allows invalid data (e.g. Feb 30th)
如何验证日期? 我的意思不是格式,而是逻辑。
例如:2月30日不是有效日期。
1 2 | var date = new Date("2015-02-29T13:02:49.073Z"); // 2015 Feb 29th does not exist console.log(date.toISOString()); |
Returns 2015-03-01T13:02:49.073Z (March 1st).
但我想要一个这个日期(输入)无效的信息。
编辑:
在Chrome中测试过。 Firefox返回"无效日期"。 但不是解析。
只有在使用日期时(例如toISOString())才会抛出异常。
1 2 3 4 5 6 7 8 9 | try { var date = new Date("2015-02-29T13:02:49.073Z"); console.log(date.toISOString()); } catch(e) { console.log("error:" + e.message); } |
火狐:
invalid date
铬:
(nothing, just switched to the next date.)
摘要:它取决于浏览器。 所以,不推荐使用。
jsfiddle的例子
我能想到的最简单的事情是将解析的日期转换为ISO字符串并将其与原始输入进行比较:
1 2 3 | var input ="2015-02-29T13:02:49.073Z" var date = new Date(input); var isValid = (input === date.toISOString()); |
我使用此函数来检查日期是否有效:
1 2 3 4 5 6 7 8 | function isValidDate(year, month, day) { month = month - 1; var d = new Date(year, month, day); if (d.getFullYear() == year && d.getMonth() == month && d.getDate() == day) { return true; } return false; } |
我为你写了一个小函数:
1 2 3 4 5 6 7 | function check_date(str){ try{ return str == new Date(str).toISOString() }catch(e){ return false; } } |
试试这个
1 2 3 | console.log(check_date('2015-02-01T13:02:49.073Z')); console.log(check_date('2015-02-35T13:02:49.073Z')); console.log(check_date('2015-02-29T13:02:49.073Z')); |
https://jsfiddle.net/8o040ctr/
如果您传递一个以'YYYY-MM'格式开头的字符串,就像您在问题中一样,您可以使用此函数:
1 2 3 4 5 6 7 | function makeDate(s) { var date = new Date(s); if (date.toISOString(date).substr(0,7) != s.substr(0,7)) throw"Invalid date"; return date; } dt = makeDate('2015-02-29T13:02:49.073Z'); |
此makeDate函数将替换普通的
浏览器中的日期总是非常棘手,我建议你像js lib一样使用:http://momentjs.com/
然后你可以使用.isValid()方法:
1 2 3 | moment('03:55', 'HH:mm').isValid(); moment('2012-05-25', 'YYYY-MM-DD').isValid(); moment('2015-02-29T13:02:49.073Z',"YYYY-MM-DDTHH:mm:ss", true).isValid(); |
我发现这种行为很有趣。我过去只是将输入转换为日期(如您所做),然后更新文本框中的文本以显示JavaScript解释的日期,以便用户看到生成的(有效)日期。
幸运的是,我们现在可以做得更好。 Moment.js是一个很棒的库,用于处理JavaScript中的日期/时间值。这对我来说确实让生活变得更加轻松!
http://momentjs.com/