【问题标题】:moment.js String + Formats not working as expectedmoment.js 字符串 + 格式未按预期工作
【发布时间】:2013-05-16 02:50:43
【问题描述】:

参考 moment.js String + Formats 的文档,我希望这两行返回相同的日期对象:

moment('12.05.1989', ['DD.MM.YYYY','YYYY-MM-DD']);
moment('1989-05-12', ['DD.MM.YYYY','YYYY-MM-DD']);

但是,我得到的是第一次约会:

{ _i: '12.05.1989',
  _f: 'YYYY-MM-DD',
  _l: undefined,
  _isUTC: false,
  _a:
   [ 12,
     4,
     19,
     0,
     0,
     0,
     0 ],
  _d: Sat May 19 12 00:00:00 GMT+0200 (W. Europe Summer Time),
  _isValid: true }

虽然第二个是正确的:

{ _i: '1989-05-12',
  _f: 'YYYY-MM-DD',
  _l: undefined,
  _isUTC: false,
  _a:
   [ 1989,
     4,
     12,
     0,
     0,
     0,
     0 ],
  _d: Fri May 12 1989 00:00:00 GMT+0200 (W. Europe Summer Time),
  _isValid: true }

当我改变数组中格式的顺序时,正好相反,它使用数组中的最后一个格式。

我做错了什么?

我想避免像检查字符串中的“-”或“.”这样的变通方法。

【问题讨论】:

    标签: node.js momentjs


    【解决方案1】:

    documentation 声明:

    解析器会忽略非字母数字字符,因此 以下将返回相同的内容。

    moment("12-25-1995", "MM-DD-YYYY");
    moment("12\25\1995", "MM-DD-YYYY");
    

    在您的情况下,它将匹配 12.05.1989 与您的最后一个模式 (YYYY-MM-DD) 并将其解析为 “12 年第 5 个月的第 1989 天”(并截断这一天因为否则它没有意义)。

    不过,我不确定如何防止这种情况发生,因此可能需要您标准化日期格式:

    > '12.05.1989'.replace(/(\d{2})\.(\d{2})\.(\d{4})/, '$3-$2-$1')
    '1989-05-12'
    

    【讨论】:

    • 但是看看文档中的例子:moment("12-25-1995", ["MM-DD-YYYY", "YYYY-MM-DD"]); - 如果你是对的,那不是需要第 12 年,第 25 个月,第 1995 天吗...?无论如何+1 正则表达式:)
    • @ToniTornado 尝试使用12-01-1995,它也被解析错误。显然moment 知道在您的示例中,没有第 25 个月,而是使用第一个模式。我不知道为什么它不接受无效的月份,但接受无效的日子。
    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多