diff --git a/test/validators.js b/test/validators.js index 4cf642c24..10e537074 100644 --- a/test/validators.js +++ b/test/validators.js @@ -852,15 +852,26 @@ describe('Validators', function () { validator: 'isDate' , valid: [ '2011-08-04' + , '2011-09-30' , '04. 08. 2011.' , '08/04/2011' , '2011.08.04' , '4. 8. 2011. GMT' + , '2. 28. 2011. GMT' + , '2. 29. 2008. GMT' + , '2. 29. 1988. GMT' , '2011-08-04 12:00' + , '2/29/24' + , '2-29-24' ] , invalid: [ 'foo' , '2011-foo-04' + , '2011-09-31' + , '2. 29. 1987. GMT' + , '2. 29. 2011. GMT' + , '2/29/25' + , '2-29-25' , 'GMT' ] }); diff --git a/validator.js b/validator.js index 8d2d155e5..bb3f068f3 100644 --- a/validator.js +++ b/validator.js @@ -450,7 +450,33 @@ }; validator.isDate = function (str) { - return !isNaN(Date.parse(str)); + var normalizedDate = new Date((new Date(str)).toUTCString()); + var regularDay = String(normalizedDate.getDate()); + var utcDay = String(normalizedDate.getUTCDate()); + var dayOrYear, dayOrYearMatches, year; + if (isNaN(Date.parse(normalizedDate))) { + return false; + } + //check for valid double digits that could be late days + //check for all matches since a string like '12/23' is a valid date + dayOrYearMatches = str.match(/[23]\d(\D|$)/g); + if (!dayOrYearMatches) { + return true; + } + dayOrYear = dayOrYearMatches.map(function(match) { + return match.slice(0,2); + }).join('/'); + year = String(normalizedDate.getFullYear()).slice(-2); + //local date and UTC date can differ, but both are valid, so check agains both + if (dayOrYear === regularDay || dayOrYear === utcDay || dayOrYear === year) { + return true; + } else if ((dayOrYear === (regularDay + '/' + year)) || (dayOrYear === (year + '/' + regularDay))) { + return true; + } else if ((dayOrYear === (utcDay + '/' + year)) || (dayOrYear === (year + '/' + utcDay))) { + return true; + } else { + return false; + } }; validator.isAfter = function (str, date) {