2013-05-16 26 views
0

参考moment.js String + Formats我预计这两条线返回相同的日期对象的文档:moment.js字符串+格式无法正常运行

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 } 

当我改变了数组格式的顺序,它恰恰相反,它使用数组中的最后一种格式。

我在做什么错?

我想避免像检查字符串“ - ”或“。”这样的解决方法。

回答

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' 
+0

但看看例如,从文档:'时刻(“12 25-1995“,[”MM-DD-YYYY“,”YYYY-MM-DD“]);' - 如果你是对的,是不是需要第12年,第25个月,第1995天......? +1为正则表达式:) – ToniTornado

+0

@ToniTornado尝试与'12-01-1995',这是解析错误以及。显然'时刻'知道在你的例子中,没有第25个月,而是将使用第一个模式。我不知道为什么它不接受无效的月份,但*会*接受无效的日子。 – robertklep