【问题标题】:moment.js validating invalid date "2013-10-311"moment.js 验证无效日期“2013-10-311”
【发布时间】:2013-09-25 06:05:51
【问题描述】:

运行 moment.js,2.2.1

moment("2010-10-319", ["YYYY-MM-DD"]).isValid()

...返回true,moment 对象将设置为 2010 年 10 月 31 日。解析器似乎去除了任何类型的无关字符:

moment("2010-10-31a", ["YYYY-MM-DD"]).isValid(); // true

好奇者,如果您添加额外的格式选择,那么“剥离”将仅限于一个字符! (格式字符串测试不应该是 ORed 吗?)

moment("2010-10-319", ["MM/DD/YYYY", "MM-DD-YYYY", "YYYY-MM-DD"]).isValid(); // true
moment("2010-10-3199", ["MM/DD/YYYY", "MM-DD-YYYY", "YYYY-MM-DD"]).isValid(); // false (!!!)

这是设计使然吗?我不明白为什么。

编辑:一位评论者发现了另一种情况,其中一个之外的额外字符确实被剥离了:

moment("2010-10-319qr", ["MM/DD/YYYY", "MM-DD-YYYY", "YYYY-MM-DD"]).isValid(); // true (!)

这是在行动:http://jsfiddle.net/grahampcharles/r42jg/6/(更新为新案例)

【问题讨论】:

  • 我正在使用报告 ( "2010-10-319qr" , ["MM/DD/YYYY", "MM-DD-YYYY", "YYYY-MM-DD"] );它给出了 // true。
  • 有趣的转折——所以剥离不一致。我已经更新了小提琴。

标签: javascript date momentjs


【解决方案1】:

Moment.js 版本2.3.0 增加了严格解析。

moment("2010-10-319", ["YYYY-MM-DD"]).isValid();       // true
moment("2010-10-319", ["YYYY-MM-DD"], true).isValid(); // false

moment("2010-10-31a", ["YYYY-MM-DD"]).isValid();       // true
moment("2010-10-31a", ["YYYY-MM-DD"], true).isValid(); // false

var formats = ["MM/DD/YYYY", "MM-DD-YYYY", "YYYY-MM-DD"];

moment("2010-10-319",  formats).isValid(); // true
moment("2010-10-3199", formats).isValid(); // false

moment("2010-10-319",  formats, true).isValid(); // false
moment("2010-10-3199", formats, true).isValid(); // false

moment("2010-10-319qr", formats).isValid();       // true
moment("2010-10-319qr", formats, true).isValid(); // false

【讨论】:

    【解决方案2】:

    从 momentjs https://github.com/moment/moment/ 在 Git 存储库上创建一个问题,这是处理此错误的最佳方法。

    【讨论】:

    • 好的,以github.com/moment/moment/issues/1128 提交...看起来这只是一个错误。
    • moment.js 似乎没有验证日期。所以,我有 var d1= moment('2/1/2013', 'MM/DD/YYYY'); var d2 = moment('2/938/2013', 'MM/DD/YYYY'); var days = d2.diff(d1, 'days'); days 的值为 93。是否设计为不验证具有给定格式的给定日期字符串?
    【解决方案3】:

    如果用户没有选择任何日期,则显示为无效日期。 这是错误的,它应该显示没有日期或未选择日期。 要在 moment.js 中更改它,您可以将其更改为 nodate 而不是无效日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多