2013-09-25 2 views
15

Running moment.js, 2.2.1moment.js проверяющие неверную дату "2013-10-311"

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

... возвращает true и объект момент должен быть установлен на 31 октября 2010 года анализатор кажется раздеться посторонние символов любого рода:

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

страньше, если добавить дополнительный выбор формата, то «зачистка» становится ограниченным только один символ! (Не должны ли быть проверочными строками формата?)

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 (!!!) 

Это поведение по дизайну? Я не понимаю, почему.

EDIT: комментатор нашел еще один случай, когда дополнительные символы за один, действительно, раздели:

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

Вот это в действии: http://jsfiddle.net/grahampcharles/r42jg/6/ (обновлено с новым делом)

+1

Я использую отчет («2010-10-319qr», [«ММ/ДД/ГГГГ», «ММ-ДД-ГГГГ», «ГГГГ-ММ-ДД»]); и это дает // true. –

+0

Интересный поворот - так что зачистка несовместима. Я обновил скрипку. –

ответ

2

создать вопрос о Git Repository from momentjs https://github.com/moment/moment/ - лучший способ справиться с этой ошибкой.

+0

ОК, представленный как https://github.com/moment/moment/issues/1128 ... похоже, что это просто ошибка. –

+0

Кажется, момент.js не подтверждает даты. Итак, у меня есть var d1 = момент ('2/1/2013', 'MM/DD/YYYY'); var d2 = момент ('2/938/2013', 'MM/DD/YYYY'); var days = d2.diff (d1, 'days'); дней имеет значение 93. Является ли по дизайну не проверять заданную строку даты с заданным форматом? – Stack0verflow

18

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 
0

Если пользователь не выбирает какую-либо дату, он отображается как недействительная дата. Это неправильно, он не должен показывать дату или дату не выбранные. Чтобы изменить это в moment.js, вы можете изменить это, чтобы назначить вместо недопустимой даты.

Смежные вопросы