Running moment.js, 2.2.1
moment("2010-10-319", ["YYYY-MM-DD"]).isValid()
... returns true
, and the moment object would be set to 31 October 2010. The parser seems to strip extraneous characters of any sort:
moment("2010-10-31a", ["YYYY-MM-DD"]).isValid(); // true
Curiouser, if you add additional format choices, then the "stripping" becomes limited to only one character! (Shouldn't the format strings tests be ORed?)
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 (!!!)
Is this behaviour by design? I'm not getting why.
EDIT: A commenter found another case where extra characters beyond one are, indeed, stripped:
moment("2010-10-319qr", ["MM/DD/YYYY", "MM-DD-YYYY", "YYYY-MM-DD"]).isValid(); // true (!)
Here is is in action: http://jsfiddle.net/grahampcharles/r42jg/6/ (updated with new case)
If the user is not selecting any date, then it is showing as invalid date. It is wrong, it should show no date or date not selected. To change that in moment.js you can change that to nodate instead of invalid date.
Moment.js version
2.3.0
added strict parsing.create an Issue on the Git Repository from momentjs https://github.com/moment/moment/ the best way to handle this error.