如何验证日期?我的意思不是格式,而是逻辑。 例如:2月30日不是有效日期。
var date = new Date("2015-02-29T13:02:49.073Z"); // 2015 Feb 29th does not exist
console.log(date.toISOString());
返回2015-03-01T13:02:49.073Z(3月1日)。
但是我想要一个这个日期(输入)无效的信息。
编辑: 在Chrome中测试过。 Firefox返回"无效日期"。但不是解析。 只有在使用日期时(例如toISOString())才会抛出异常。
try
{
var date = new Date("2015-02-29T13:02:49.073Z");
console.log(date.toISOString());
}
catch(e)
{
console.log("error: " + e.message);
}
火狐:
无效日期
Chrome:
(没有,只是切换到下一个日期。)
摘要:它取决于浏览器。所以,不推荐使用。
答案 0 :(得分:4)
我使用此功能检查日期是否有效:
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 :(得分:4)
我能想到的最简单的事情是将解析后的日期转换为ISO字符串并将其与原始输入进行比较:
var input = "2015-02-29T13:02:49.073Z"
var date = new Date(input);
var isValid = (input === date.toISOString());
答案 2 :(得分:2)
我为你写了一个小函数:
function check_date(str){
try{
return str == new Date(str).toISOString()
}catch(e){
return false;
}
}
试试这个
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'));
答案 3 :(得分:0)
我发现这种行为很有趣。我过去只是将输入转换为日期(就像你已经完成的那样),然后更新文本框中的文本以显示JavaScript解释的日期,这样用户就可以看到生成的(有效)日期。
幸运的是,我们现在可以做得更好。 Moment.js是一个很棒的库,用于处理JavaScript中的日期/时间值。这对我来说确实让生活变得更轻松!
答案 4 :(得分:0)
浏览器中的日期总是非常棘手,我建议您使用js lib这样的时刻:http://momentjs.com/
然后你可以使用.isValid()方法来表示:
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();
答案 5 :(得分:0)
如果您传递的字符串以' YYYY-MM'格式,就像你在问题中一样,你可以使用这个函数:
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 函数将替换普通new Date(...)
调用,但在传递无效日期字符串时也会在Chrome中引发错误。