2013-05-16 4 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) и разобрать его как «день 1989 года 5-го месяца 12 года» (и обрезает день, потому что в противном случае не имеет смысла).

Я не знаю, как предотвратить это, хотя, так что это может потребовать, чтобы нормализовать свои форматы даты:

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

Но посмотрите на пример из документации: 'момент (" 12- 25-1995 », [« ММ-ДД-ГГГГ »,« ГГГГ-ММ-ДД »]);' - если бы вы были правы, это не займет 12-й, 25-й, 1995-й день ...? +1 для regex так или иначе :) – ToniTornado

+0

@ToniTornado попробуйте сделать это с '12-01-1995', это тоже неправильно. По-видимому, «момент» знает, что в вашем примере нет 25-го месяца и вместо этого будет использовать первый шаблон. Я не знаю, почему он не будет принимать недопустимые месяцы, но * будет * принимать недопустимые дни. – robertklep