【问题标题】:How to check invalid date in Javascript in FireFox如何在 FireFox 中检查 Javascript 中的无效日期
【发布时间】:2016-07-05 06:07:16
【问题描述】:

我想测试无效的日期,我写的函数在 chrome 中可以正常工作,但在 Firefox 中不行。以下是一些不适用于 FF 的示例:

  1. new Date('01/99/2010') = 返回有效日期
  2. new Date('99/01/2010') = 返回有效日期
  3. var 日='01',月='99',年='2010'; new Date(year,month,day) = 返回有效日期
  4. var 日='99',月='01',年='2010'; new Date(year,month,day) = 返回有效日期

上述方法在 Chrome 中返回“无效日期”,但在 Firefox 中不返回。有谁知道在 Firefox 中验证日期的正确方法。

PS:输入字符串可以是-mm/dd/yyyy or dd/mm/yyyy or yyyy/mm/dd

【问题讨论】:

标签: javascript angularjs


【解决方案1】:

您可以使用正则表达式。试试这个:

var rgx = /^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/;
console.log(rgx.test("99/12/2015"));

jsFiddle

【讨论】:

  • 我试过这个日期。它正在工作。它返回真实。我在控制台中打印了结果。请查看控制台查看结果。
【解决方案2】:

我会使用内部 JavaScript 函数来验证日期,因为浏览器处理这些数据类型的方式非常不同。

    function isValidDate(date)
    {
    var matches = /^(\d{2})[-\/](\d{2})[-\/](\d{4})$/.exec(date);
    if (matches == null) return false;
    var d = matches[2];
    var m = matches[1] - 1;
    var y = matches[3];
    var checkDate = new Date(y, m, d);
    return checkDate.getDate() == d &&
    checkDate.getMonth() == m &&
    checkDate.getFullYear() == y;
    }

然后你会像这样使用它:

   var d = new Date(2010, 99, 1);
   console.log( isValidDate(d) ); // returns false no valid date

【讨论】:

  • 这将为(2010/03/01);返回false
【解决方案3】:

看起来 Firefox 比 Chrome 更进一步:

注意:其中 Date 被称为具有多个的构造函数 参数,如果值大于它们的逻辑范围(例如 13 是 以月份值或分钟值 70 的形式提供),相邻的 值将被调整。例如。 new Date(2013, 13, 1) 相当于 new Date(2014, 1, 1),都为 2014-02-01 创建一个日期(注意 月是从 0 开始的)。其他值也类似: new Date(2013, 2, 1, 0, 70) 相当于 new Date(2013, 2, 1, 1, 10) 两者都创建一个 日期为 2013-03-01T01:10:00。

来源 - MDN Date documentation

这里的重点是有多个参数。这就是 Chrome 做 Firefox 的原因:

new Date(2010, 99, 1); - 一个有效的日期对象。

但是因为:

new Date('01/99/2010'); 在技术上只是一个参数,它不属于 Chrome 中的上述规则,但 Firefox 允许它通过。

考虑到上述情况,以及跨浏览器的不一致,看起来你可能会被困在分别为日、月和年编写验证器,而不是尝试通过 Date 对象进行验证,如果你想让它工作的话在 Firefox 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2012-10-01
    • 2016-10-18
    相关资源
    最近更新 更多