Checks if a date is valid and returns error codes described bellow.
[UPDATED CODE AND HELP CAN BE FOUND HERE]
//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/geral/is-date [v1.0]
isDate = function(y, m, d){ //v1.0
if(typeof y == "string" && m instanceof RegExp && d){
if(!m.test(y)) return 1;
y = RegExp["$" + d.y], m = RegExp["$" + d.m], d = RegExp["$" + d.d];
}
d = Math.abs(d) || 0, m = Math.abs(m) || 0, y = Math.abs(y) || 0;
return arguments.length != 3 ? 1 : d < 1 || d > 31 ? 2 : m < 1 || m > 12 ? 3 : /4|6|9|11/.test(m) && d == 31 ? 4
: m == 2 && (d > ((y = !(y % 4) && (y % 1e2) || !(y % 4e2)) ? 29 : 28)) ? 5 + !!y : 0;
};
Usage
<script type="text/javascript">
getDateMsg = function(x){
return x == 0 ? "Valid Date"
: x == 1 ? "Invalid date format"
: x == 2 ? "Invalid day"
: x == 3 ? "Invalid month"
: x == 4 ? "In April, June, September and November there's no 31 day"
: x == 5 ? "February has only 28 days"
: x == 6 ? "In leap years, February has 29 days": "nothing =]";
};
var x = [
isDate("22/07/1984", /^([0-9]{1,2})[\/]([0-9]{1,2})[\/]([0-9]{1,4})$/, {d: 1, m: 2, y: 3}),
isDate("1984-07-22", /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/, {d: 3, m: 2, y: 1}),
isDate("07-22-1984", /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/, {d: 3, m: 2, y: 1}),
isDate(2000, 1, 32),
isDate(2000, 0, 1),
isDate(2000, 4, 31),
isDate(2001, 2, 29),
isDate(2004, 2, 30)
];
for(var i = -1, l = x.length; ++i < l; document.write(getDateMsg(x[i]), "<br />"));
</script>
Help
isDate(y: Integer, m: Integer, d: Integer): Integer
Checks a date and returns 0 if it's valid or one of the error codes bellow.
y year
m month
d day
isDate(date: String, matcher: RegExp, map: Object): Integer
Checks a date and returns 0 if it's valid or one of the error codes bellow.
date date in a string form
matcher regular expression responsible to find and store the day, month and year
map object containing the position where each date component is localized inside the regular expression. Its format is the following: {d: positionOfTheDay, m: positionOfTheMonth, y: positionOfTheYear}
Return codes
* 0 = Valid date
* 1 = Date format invalid (regular expression failed or amount of arguments != 3)
* 2 = Day isn't between 1 and 31
* 3 = Month isn't between 1 and 12
* 4 = On April, June, September and November there isn't the day 31
* 5 = On February the month has only 28 days
* 6 = Leap year, February has only 29 days