【问题标题】:moment.js is doing weird things when parsing a badly formatted date在解析格式错误的日期时,moment.js 正在做一些奇怪的事情
【发布时间】:2015-09-02 14:14:16
【问题描述】:

如果我将 YYYY-MM-17 指定为 moment.js 的日期,它表示这是一个有效的日期:

var myMoment = moment('YYYY-MM-17', 'YYYY-MM-DD');

console.log(myMoment.isValid()); // -> true

console.log(myMoment.get('year')); // -> 2017
console.log(myMoment.get('month')); // -> 0
console.log(myMoment.get('day')); // -> 0

https://jsfiddle.net/seu6x3k3/3/

我还在不同的浏览器上看到了不同的结果。根据docs

...我们首先检查字符串是否与已知的 ISO 8601 格式匹配,如果未找到已知格式,则回退到 new Date(string)

这不是我看到的。当本地使用相同格式指定日期时:

var date = new Date('YYYY-MM-17'); // -> NaN

console.log(date.getYear()); // -> NaN
console.log(date.getMonth()); // -> NaN
console.log(date.getDay()); // -> NaN

https://jsfiddle.net/3p5x1qn3/

【问题讨论】:

  • 我尝试回答这个问题,但当我发现 Moment 将 moment('foo-bar-17') 视为无效但 moment('foo-bar-1')moment('foo-bar-12') 视为 2001 年 1 月至 12 月 1 日时,我不得不放弃。我不确定你看到了什么不同的结果,但它可能与this question I answered a few weeks back有关。
  • 谢谢詹姆斯。发现解析有一个“严格”选项。在下面发布我的答案。

标签: javascript date momentjs


【解决方案1】:

原来有一个严格的选项。来自docs

Moment 的解析器非常宽容,这可能会导致不良行为。从 2.3.0 版本开始,您可以为最后一个参数指定一个布尔值,以使 Moment 使用严格解析。严格解析要求格式和输入完全匹配。

var myMoment = moment('YYYY-MM-17', 'YYYY-MM-DD', true);

console.log(myMoment.isValid()); // -> false

console.log(myMoment.get('year')); // -> 2016
console.log(myMoment.get('month')); // -> 4
console.log(myMoment.get('day')); // -> 0

https://jsfiddle.net/seu6x3k3/5/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    相关资源
    最近更新 更多