Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript日期允许使用无效数据(例如2月30日)_Javascript_Date - Fatal编程技术网

Javascript日期允许使用无效数据(例如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

如何验证日期?我指的不是形式,而是逻辑。 例如: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返回“无效日期”。但不是解析。 只有在使用日期时(例如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字符串的正则表达式。