Ответ 1
создать проблему в репозитории Git from momentjs https://github.com/moment/moment/ лучший способ справиться с этой ошибкой.
Запуск момента .js, 2.2.1
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/ (обновлено в новом случае)
создать проблему в репозитории Git from momentjs https://github.com/moment/moment/ лучший способ справиться с этой ошибкой.
Moment.js version 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
Если пользователь не выбирает какую-либо дату, он отображается как недопустимая дата. Это неправильно, он не должен показывать дату или дату, которые не выбраны. Чтобы изменить это в moment.js, вы можете изменить это, чтобы указывать вместо недопустимой даты.