Javascript日期允许使用无效数据(例如2月30日)
如何验证日期?我指的不是形式,而是逻辑。 例如:2月30日不是有效日期Javascript日期允许使用无效数据(例如2月30日),javascript,date,Javascript,Date,如何验证日期?我指的不是形式,而是逻辑。 例如: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日) 但是我想知道这个日期(输入)是无效的 编辑: 在铬中测试。Firefox返回“无效日期”。但不是解析。 只有在使用日期时(例如toI
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日)
但是我想知道这个日期(输入)是无效的
编辑:
在铬中测试。Firefox返回“无效日期”。但不是解析。
只有在使用日期时(例如toISOString())才会引发异常
try
{
var date = new Date("2015-02-29T13:02:49.073Z");
console.log(date.toISOString());
}
catch(e)
{
console.log("error: " + e.message);
}
火狐:
无效日期
铬:
(没什么,只是切换到下一个日期。)
摘要:它依赖于浏览器。所以,不建议使用
我使用此功能检查日期是否有效:
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;
}
我觉得那种行为很有趣。我以前只是将输入转换为日期(正如您所做的那样),然后更新文本框中的文本以显示JavaScript解释的日期,这样用户就可以看到结果(有效)日期 幸运的是,我们现在可以做得更好。js是一个极好的库,用于处理JavaScript中的日期/时间值。这确实让我的生活轻松多了
我能想到的最简单的事情是将解析的日期转换为ISO字符串,并将其与原始输入进行比较:
var input = "2015-02-29T13:02:49.073Z"
var date = new Date(input);
var isValid = (input === date.toISOString());
浏览器中的日期总是非常棘手,我建议您使用类似js lib的时刻: 然后您可以使用.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();
如果您传递的字符串以“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函数将替换普通的
新日期(…)
调用,但当传递无效的日期字符串时,也会在Chrome中引发错误。我为您编写了一个小函数:
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'));
Stop:我现在知道这取决于浏览器。Firefox返回无效日期,chrome忽略并计数到第二天。好吧,但这太可怕了。我必须编写自己的函数来验证日期字符串。(?)在ES5之前,不建议使用Date.parse,因为字符串的解析完全依赖于实现。在不同的主机解析日期字符串的方式上仍然存在许多差异,因此应该手动解析日期字符串(如果要容纳许多不同的格式,库可以提供帮助)。这里有问题吗?Date构造函数处理各种参数的逻辑在中有完整的文档记录。如何验证日期(即值)已包含在本手册中。@RobG这与本手册完全不同。问题是Date对象允许无效数据。很高兴知道这取决于浏览器。它与ECMA“无关”。这是一种浏览器行为。这些信息很有用。但是谢谢你的链接和建议。是的,我也认为你必须这样做。仅用Date()解析是不够的。:)注意:您可能需要将时区/夏令时标准化并添加到此代码中,如我的answer@mplungjan-可以忽略日期的夏令时(前提是浏览器没有bug)。只需测试月份(因为超出月份范围的日期和超出1到12(含12)的月份将导致getMonth返回不同的月份号)。创建的日期可能在午夜左右,因此第二天取决于时区。据我所知,根本没有建议。你测试过最后一个吗?@trincot我想他回答的方式在任何浏览器中都适用。你是对的,我没有领会答案的要点:-)是的,谢谢。我也有同样的想法。它只适用于相同的字符串格式。但这正是我需要的。我已经有了一个用于验证ISO字符串的正则表达式。