How to validate date only in this format mm/dd/yy? - javascript

Can you please tell me how to validate date only when in this format mm/dd/yy ? I actually found a solution but it also returns true when mm-dd-yy.
I need only it return true when the format is mm/dd/yy.
Here is my fiddle
:
http://jsfiddle.net/naveennsit/Hk2tc/
alert(isDate("1/12/1234"));
function isDate(txtDate)
{
var currVal = txtDate;
if(currVal == '')
return false;
//Declare Regex
var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
var dtArray = currVal.match(rxDatePattern); // is format OK?
if (dtArray == null)
return false;
//Checks for mm/dd/yyyy format.
dtMonth = dtArray[1];
dtDay= dtArray[3];
dtYear = dtArray[5];
if (dtMonth < 1 || dtMonth > 12)
return false;
else if (dtDay < 1 || dtDay> 31)
return false;
else if ((dtMonth==4 || dtMonth==6 || dtMonth==9 || dtMonth==11) && dtDay ==31)
return false;
else if (dtMonth == 2)
{
var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
if (dtDay> 29 || (dtDay ==29 && !isleap))
return false;
}
return true;
}

your problem is your regex... it also accept the / char.
Change to
var rxDatePattern = /^(\d{1,2})(-)(\d{1,2})(-)(\d{4})$/;
however, this regex also accepts dates like 40-40-9999...
and of course, you don't have the day 40 in the 40th month ;)
check this link for help
http://www.regular-expressions.info/dates.html

You are using - in var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;.
You are not filtering -.
Check this Updated fiddle

Your issue is in the regex...
(\/|-) means "accept either / or - character".
Try changing this line:
var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
To this:
var rxDatePattern = /^(\d{1,2})(\/)(\d{1,2})(\/)(\d{4})$/;
The difference is that both occurrences of (\/|-) were replaced with (\/), which only matches /.

Related

How to determine if the date is full date and year only in JS

I have this regex code below to validate a valid date.
function isValidDate(div) {
var reg = /^((0?\d)|(1[012]))\/([012]?\d|30|31)\/\d{1,4}$/;
var regs = /^\/\d{1,4}$/;
var dateField = $(div).val();
if (dateField == "") {
//alert('Invalid inclusive dates.');
return false;
} else {
if (reg.test(dateField) == false && regs.test(dateField) == false) {
// alert('Invalid inclusive dates.');
return false;
} else {
return true;
}
}
}
I am testing this code as you can see I have 2 condition in if (reg.test(dateField) == false && regs.test(dateField) == false) {. In this line I am testing if the date is full date(1/1/2017) or (2017) only. If I input that two different dates it return false because of the condition. How to achieve this?.
Make day and month optional:
var reg = /^(?:(0?\d|1[012])\/(0?[1-9]|[12]\d|30|31)\/)?\d{1,4}$/;
// ^^^ ^^

Form date (yyyy-mm-dd) validation.

In my validation file i have a "prepare Data" function that saves to data from the DOM into a JSON and returns it as data.applicants.occupation_since:
applicants.occupation_since = mainAppContainer.find(".employmentPeriodStart").val()
And then validates it in a "validate" function:
var validateOccupationCompany, validateOccupationSince;
if (data.applicants[0].occupation === 'full_time' || data.applicants[0].occupation === 'hourly' || data.applicants[0].occupation === 'part_time' || data.applicants[0].occupation === 'finite_time') {
validateOccupationCompany = true;
validateOccupationSince = true;
}
var dateVal, dateValues, dtDay, dtMonth, dtYear, isleap, validatePattern;
if (validateOccupationSince) {
dateVal = data.applicants[0].occupation_since;
validatePattern = /^(\d{4})(\/|-)(\d{1,2})(\/|-)(\d{1,2})$/;
dateValues = dateVal.match(validatePattern);
dtYear = dateValues[1];
dtMonth = dateValues[3];
dtDay = dateValues[5];
if (validatePattern.test(dateVal) !== true) {
ret.status = false;
ret.errorMessages.push("SOME ERROR MSG");
ret.errorClasses.push(".employmentPeriodStart");
} else if (dtMonth < 1 || dtMonth > 12) {
ret.status = false;
ret.errorMessages.push("SOME ERROR MSG.");
ret.errorClasses.push(".employmentPeriodStart");
} else if (dtDay < 1 || dtDay > 31) {
ret.status = false;
ret.errorMessages.push("SOME ERROR MSG.");
ret.errorClasses.push(".employmentPeriodStart");
} else if ((dtMonth === 4 || dtMonth === 6 || dtMonth === 9 || dtMonth === 11) && dtDay === 31) {
ret.status = false;
ret.errorMessages.push("SOME ERROR MSG.");
ret.errorClasses.push(".employmentPeriodStart");
} else if (dtMonth === 2) {
isleap = dtYear % 4 === 0 && (dtYear % 100 !== 0 || dtYear % 400 === 0);
if (dtDay > 29 || (dtDay === 29 && !isleap)) {
ret.status = false;
ret.errorMessages.push("SOME ERROR MSG.");
ret.errorClasses.push(".employmentPeriodStart");
}
}
}
I've been stuck trying to make it work for sometime and haven't been able to solve it, and it looks kind of messy atm.
An alternative solution is fine, or if you could point me in the right direction.
We've also been struggling with Date, Time and DateTime and its formats.
I would strongly recommend to use MomentJs.
For date (yyyy-mm-dd) validation you can use this RegEx.pattern.test(input) returns True if date has the same format as you want. Demo
var input = '1997-01-01';
var pattern =/^([0-9]{4})\-([0-9]{2})\-([0-9]{2})$/;
alert(pattern.test(input));
Then, you can validate like this. Demo
var invalidDate = '2011-30-02';
var comp = invalidDate.split('-');
var m = parseInt(comp[1], 10);
var d = parseInt(comp[2], 10);
var y = parseInt(comp[0], 10);
var date = new Date(y,m-1,d);
if (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d) {
alert('Valid date');
} else {
alert('Invalid date');
}
I Hope it helps

Javascript validate date format (include the hyphens)

I have date inputs which I need to store as DD-MMM-YYYY. I have the code below to test. For the most part it does make sure the data is in DD MMM YYYY format, but I need to include the hyphens. For instance 01-JUN-2015 is said to be valid, but so is 01/JUN/2015. The second should fail. I have tried to include the hyphens without success.
function testDate(sender, args) {
var result = isDate(document.getElementById('dateTest').value);
console.log(document.getElementById('dateTest').value);
console.log(result);
$('#result').text(result);
}
//function isDate(txtDate) {
function isDate(currVal) {
if (currVal == '') return false;
//Declare Regex
var rxDatePattern = /^(\d{1,2})(\/|-)(?:(\d{1,2})|(jan)|(feb)|(mar)|(apr)|(may)|(jun)|(jul)|(aug)|(sep)|(oct)|(nov)|(dec))(\/|-)(\d{4})$/i;
var dtArray = currVal.match(rxDatePattern);
if (dtArray == null) return false;
var dtDay = parseInt(dtArray[1]);
var dtMonth = parseInt(dtArray[3]);
var dtYear = parseInt(dtArray[17]);
if (isNaN(dtMonth)) {
for (var i = 4; i <= 15; i++) {
if ((dtArray[i])) {
dtMonth = i - 3;
break;
}
}
}
if (dtMonth < 1 || dtMonth > 12) return false;
else if (dtDay < 1 || dtDay > 31) return false;
else if ((dtMonth == 4 || dtMonth == 6 || dtMonth == 9 || dtMonth == 11) && dtDay == 31) return false;
else if (dtMonth == 2) {
var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
if (dtDay > 29 || (dtDay == 29 && !isleap)) return false;
}
Personally, I think I'd go with the moment.js library to do what you want to do. They have all of these mechanics worked out for you and then some:
http://momentjs.com/docs/#/parsing/is-valid/
It's a lot less of a hassle and way more efficient than doing it yourself.

Masking date appends extra character in IE8 but works fine in IE11, chrome and other browsers

I have this below function to mask the date when user types the date in the field. I've used jquery-ui-datepicker and the strange thing is when datepicker is not associated with the field this works as expected.
Note - I am getting this problem in IE8 but works fine in IE11, Chrome etc.,
DEMO
Problem example: Type 121 in date field it should replace it with 12/1 but its placing extra character like 12/11. Can anyone let me know what's causing this issue:
function maskDate(element) {
var chr = window.event.keyCode
var str = document.getElementById(element).value
var lastindex = str.length - 1
var lastchr = str.charAt(lastindex)
if (chr < 48 || chr > 57) {
if (str.length == 1 && (chr == 45 || chr == 47)) {
document.getElementById(element).value = "0" + str + "/";
return false;
}
if (str.length == 4 && (chr == 45 || chr == 47)) {
document.getElementById(element).value = str.substr(0, lastindex) + "0" + lastchr + "/";
return false;
}
if (chr == 47 && (str.length == 2 || str.length == 5)) return true;
else {
if (chr == 45 && (str.length == 2 || str.length == 5))
document.getElementById(element).value = str + "/";
return false;
}
}
else {
if (str.length == 2 || str.length == 5) {
document.getElementById(element).value = str + "/" + String.fromCharCode(chr);
return false;
}
if (str.length > 9) return false;
return true;
}
}
UPDATE :
Just placed a debugger and noted that
document.getElementById(element).value = str + "/" + String.fromCharCode(chr);
in the above line the value of document.getElementById(element).value is getting set properly but then I am not getting where the extra value is getting set because the control is getting passed to jquery.js after return false which makes complicated to understand the exact flow then!

Javascript: how to validate dates in format MM-DD-YYYY?

I saw a potential answer here but that was for YYYY-MM-DD: JavaScript date validation
I modified the code code above for MM-DD-YYYY like so but I still can't get it to work:
String.prototype.isValidDate = function()
{
var IsoDateRe = new RegExp("^([0-9]{2})-([0-9]{2})-([0-9]{4})$");
var matches = IsoDateRe.exec(this);
if (!matches) return false;
var composedDate = new Date(matches[3], (matches[1] - 1), matches[2]);
return ((composedDate.getMonth() == (matches[1] - 1)) &&
(composedDate.getDate() == matches[2]) &&
(composedDate.getFullYear() == matches[3]));
}
How can I get the above code to work for MM-DD-YYYY and better yet MM/DD/YYYY?
Thanks.
function isValidDate(date)
{
var matches = /^(\d{1,2})[-\/](\d{1,2})[-\/](\d{4})$/.exec(date);
if (matches == null) return false;
var d = matches[2];
var m = matches[1] - 1;
var y = matches[3];
var composedDate = new Date(y, m, d);
return composedDate.getDate() == d &&
composedDate.getMonth() == m &&
composedDate.getFullYear() == y;
}
console.log(isValidDate('10-12-1961'));
console.log(isValidDate('12/11/1961'));
console.log(isValidDate('02-11-1961'));
console.log(isValidDate('12/01/1961'));
console.log(isValidDate('13-11-1961'));
console.log(isValidDate('11-31-1961'));
console.log(isValidDate('11-31-1061'));
It works. (Tested with Firebug, hence the console.log().)
function isValidDate(date) {
var valid = true;
date = date.replace('/-/g', '');
var month = parseInt(date.substring(0, 2),10);
var day = parseInt(date.substring(2, 4),10);
var year = parseInt(date.substring(4, 8),10);
if(isNaN(month) || isNaN(day) || isNaN(year)) return false;
if((month < 1) || (month > 12)) valid = false;
else if((day < 1) || (day > 31)) valid = false;
else if(((month == 4) || (month == 6) || (month == 9) || (month == 11)) && (day > 30)) valid = false;
else if((month == 2) && (((year % 400) == 0) || ((year % 4) == 0)) && ((year % 100) != 0) && (day > 29)) valid = false;
else if((month == 2) && ((year % 100) == 0) && (day > 29)) valid = false;
else if((month == 2) && (day > 28)) valid = false;
return valid;
}
This checks for valid days in each month and for valid leap year days.
How about validating dates in "ANY" date format? I've been using the DateJS library and adding it to existing forms to ensure that I get valid dates & times formatted the way that I want. The user can even enter things like "now" and "tomorrow" and it will be converted into a valid date.
Here's the dateJS library:
http://www.datejs.com/
and here's a jQuery tip that I wrote:
http://www.ssmedia.com/utilities/jquery/index.cfm/datejs.htm
I would use Moment.js for this task. It makes it very easy to parse dates and it also provides support to detect a an invalid date1 in the correct format. For instance, consider this example:
var formats = ['MM-DD-YYYY', 'MM/DD/YYYY']
moment('11/28/1981', formats).isValid() // true
moment('2-29-2003', formats).isValid() // false (not leap year)
moment('2-29-2004', formats).isValid() // true (leap year)
First moment(.., formats) is used to parse the input according to the localized format supplied. Then the isValid function is called on the resulting moment object so that we can actually tell if it is a valid date.
This can be used to trivially derive the isValidDate method:
String.prototype.isValidDate = function() {
var formats = ['MM-DD-YYYY', 'MM/DD/YYYY'];
return moment("" + this, formats).isValid();
}
1 As I can find scarce little commentary on the matter, I would only use moment.js for dates covered by the Gregorian calendar. There may be plugins for other (including historical or scientific) calendars.
I use this regex for validating MM-DD-YYYY:
function isValidDate(subject){
if (subject.match(/^(?:(0[1-9]|1[012])[\- \/.](0[1-9]|[12][0-9]|3[01])[\- \/.](19|20)[0-9]{2})$/)){
return true;
}else{
return false;
}
}
It will match only valid months and you can use / - or . as separators.
This function will validate the date to see if it's correct or if it's in the proper format of: DD/MM/YYYY.
function isValidDate(date)
{
var matches = /^(\d{2})[-\/](\d{2})[-\/](\d{4})$/.exec(date);
if (matches == null) return false;
var d = matches[1];
var m = matches[2]-1;
var y = matches[3];
var composedDate = new Date(y, m, d);
return composedDate.getDate() == d &&
composedDate.getMonth() == m &&
composedDate.getFullYear() == y;
}
console.log(isValidDate('10-12-1961'));
console.log(isValidDate('12/11/1961'));
console.log(isValidDate('02-11-1961'));
console.log(isValidDate('12/01/1961'));
console.log(isValidDate('13-11-1961'));
console.log(isValidDate('11-31-1961'));
console.log(isValidDate('11-31-1061'));
what isn't working about it? here's a tested version:
String.prototype.isValidDate = function() {
const match = this.match(/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/);
if (!match || match.length !== 4) {
return false
}
const test = new Date(match[3], match[1] - 1, match[2]);
return (
(test.getMonth() == match[1] - 1) &&
(test.getDate() == match[2]) &&
(test.getFullYear() == match[3])
);
}
var date = '12/08/1984'; // Date() is 'Sat Dec 08 1984 00:00:00 GMT-0800 (PST)'
alert(date.isValidDate() ); // true
You can simplify it somewhat by changing the first two lines of the function to this:
var matches = this.match(/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/);
Or, just change the parameter to the RegExp constructor to be
^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$
Simple way to solve
var day = document.getElementById("DayTextBox").value;
var regExp = /^([1-9]|[1][012])\/|-([1-9]|[1][0-9]|[2][0-9]|[3][01])\/|-([1][6-9][0-9][0-9]|[2][0][01][0-9])$/;
return regExp.test(day);
pass this function to date with format //10-10-2012 and id of object.
function isValidDateFormat(date, id)
{
var todayDate = new Date();
var matches = /^(\d{2})[-\/](\d{2})[-\/](\d{4})$/.exec(date);
if (matches == null)
{
if(date != '__-__-____')
{
alert('Please enter valid date');
}
}
else
{
var day = 31;
var month = 12;
var b_date = date.split("-");
if(b_date[0] <= day)
{
if(b_date[1] <= month)
{
if(b_date[2] >= 1900 && b_date[2] <= todayDate.getFullYear())
{
return true;
}
else
{
$("#"+id).val('');
alert('Please enter valid Year');
}
}
else
{
$("#"+id).val('');
alert('Please enter valid Month');
}
}
else
{
alert('Please enter valid Day');
$("#"+id).val('');
}
}
}
This is for validating the date string in formate dd.mm.yyyy It is easy to customize it. You just need to adjust the pos1 and pos2 in isValidDate().
var dtCh= ".";
var minYear=1900;
function isInteger(s){
var i;
for (i = 0; i < s.length; i++){
// Check that current character is number.
var c = s.charAt(i);
if (((c < "0") || (c > "9"))) return false;
}
// All characters are numbers.
return true;
}
function stripCharsInBag(s, bag){
var i;
var returnString = "";
// Search through string's characters one by one.
// If character is not in bag, append to returnString.
for (i = 0; i < s.length; i++){
var c = s.charAt(i);
if (bag.indexOf(c) == -1) returnString += c;
}
return returnString;
}
function daysInFebruary (year){
// February has 29 days in any year evenly divisible by four,
// EXCEPT for centurial years which are not also divisible by 400.
return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
for (var i = 1; i <= n; i++) {
this[i] = 31;
if (i==4 || i==6 || i==9 || i==11) {
this[i] = 30;
}
if (i==2) {
this[i] = 29;
}
}
return this;
}
function isValidDate(dtStr){
var daysInMonth = DaysArray(12);
var pos1=dtStr.indexOf(dtCh);
var pos2=dtStr.indexOf(dtCh,pos1+1);
var strDay=dtStr.substring(0,pos1);
var strMonth=dtStr.substring(pos1+1,pos2);
var strYear=dtStr.substring(pos2+1);
strYr=strYear;
if (strDay.charAt(0)=="0" && strDay.length>1)
strDay=strDay.substring(1);
if (strMonth.charAt(0)=="0" && strMonth.length>1)
strMonth=strMonth.substring(1);
for (var i = 1; i <= 3; i++) {
if (strYr.charAt(0)=="0" && strYr.length>1)
strYr=strYr.substring(1);
}
month=parseInt(strMonth);
day=parseInt(strDay);
year=parseInt(strYr);
if (pos1==-1 || pos2==-1){
alert("The date format should be : dd.mm.yyyy");
return false;
}
if (strMonth.length<1 || month<1 || month>12){
alert("Please enter a valid month");
return false;
}
if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
alert("Please enter a valid day");
return false;
}
if (strYear.length != 4 || year==0 || year<minYear){
alert("Please enter a valid 4 digit year after "+minYear);
return false;
}
if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
alert("Please enter a valid date");
return false;
}
return true;
}
if (document.getElementById('expiryDay').value != test(match("/^([0-9]{2})\/([0-9]{2})$/"))){
alert("Enter the date in two digit month flowed by two digits year \n");
}
<!DOCTYPE html>
<html>
<head>
<title></title>
<script>
function dateCheck(inputText) {
debugger;
var dateFormat = /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/;
var flag = 1;
if (inputText.value.match(dateFormat)) {
document.myForm.dateInput.focus();
var inputFormat1 = inputText.value.split('/');
var inputFormat2 = inputText.value.split('-');
linputFormat1 = inputFormat1.length;
linputFormat2 = inputFormat2.length;
if (linputFormat1 > 1) {
var pdate = inputText.value.split('/');
}
else if (linputFormat2 > 1) {
var pdate = inputText.value.split('-');
}
var date = parseInt(pdate[0]);
var month = parseInt(pdate[1]);
var year = parseInt(pdate[2]);
var ListofDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
if (month == 1 || month > 2) {
if (date > ListofDays[month - 1]) {
alert("Invalid date format!");
return false;
}
}
if (month == 2) {
var leapYear = false;
if ((!(year % 4) && year % 100) || !(year % 400)) {
leapYear = true;
}
if ((leapYear == false) && (date >= 29)) {
alert("Invalid date format!");
return false;
}
if ((leapYear == true) && (date > 29)) {
alert("Invalid date format!");
return false;
}
}
if (flag == 1) {
alert("Valid Date");
}
}
else {
alert("Invalid date format!");
document.myForm.dateInput.focus();
return false;
}
}
function restrictCharacters(evt) {
evt = (evt) ? evt : window.event;
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (((charCode >= '48') && (charCode <= '57')) || (charCode == '47')) {
return true;
}
else {
return false;
}
}
</script>
</head>
<body>
<div>
<form name="myForm" action="#">
<table>
<tr>
<td>Enter Date</td>
<td><input type="text" onkeypress="return restrictCharacters(event);" name="dateInput"/></td>
<td></td>
<td><span id="span2"></span></td>
</tr>
<tr>
<td></td>
<td><input type="button" name="submit" value="Submit" onclick="dateCheck(document.myForm.dateInput)" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
Please find in the below code which enables to perform the date validation for any of the supplied format or based on user locale to validate start/from and end/to dates. There could be some better approaches but have come up with this. Have tested it for the formats like: MM/dd/yyyy, dd/MM/yyyy, yyyy-MM-dd, yyyy.MM.dd, yyyy/MM/dd and dd-MM-yyyy.
Note supplied date format and date string go hand in hand.
<script type="text/javascript">
function validate(format) {
if(isAfterCurrentDate(document.getElementById('start').value, format)) {
alert('Date is after the current date.');
} else {
alert('Date is not after the current date.');
}
if(isBeforeCurrentDate(document.getElementById('start').value, format)) {
alert('Date is before current date.');
} else {
alert('Date is not before current date.');
}
if(isCurrentDate(document.getElementById('start').value, format)) {
alert('Date is current date.');
} else {
alert('Date is not a current date.');
}
if (isBefore(document.getElementById('start').value, document.getElementById('end').value, format)) {
alert('Start/Effective Date cannot be greater than End/Expiration Date');
} else {
alert('Valid dates...');
}
if (isAfter(document.getElementById('start').value, document.getElementById('end').value, format)) {
alert('End/Expiration Date cannot be less than Start/Effective Date');
} else {
alert('Valid dates...');
}
if (isEquals(document.getElementById('start').value, document.getElementById('end').value, format)) {
alert('Dates are equals...');
} else {
alert('Dates are not equals...');
}
if (isDate(document.getElementById('start').value, format)) {
alert('Is valid date...');
} else {
alert('Is invalid date...');
}
}
/**
* This method gets the year index from the supplied format
*/
function getYearIndex(format) {
var tokens = splitDateFormat(format);
if (tokens[0] === 'YYYY'
|| tokens[0] === 'yyyy') {
return 0;
} else if (tokens[1]=== 'YYYY'
|| tokens[1] === 'yyyy') {
return 1;
} else if (tokens[2] === 'YYYY'
|| tokens[2] === 'yyyy') {
return 2;
}
// Returning the default value as -1
return -1;
}
/**
* This method returns the year string located at the supplied index
*/
function getYear(date, index) {
var tokens = splitDateFormat(date);
return tokens[index];
}
/**
* This method gets the month index from the supplied format
*/
function getMonthIndex(format) {
var tokens = splitDateFormat(format);
if (tokens[0] === 'MM'
|| tokens[0] === 'mm') {
return 0;
} else if (tokens[1] === 'MM'
|| tokens[1] === 'mm') {
return 1;
} else if (tokens[2] === 'MM'
|| tokens[2] === 'mm') {
return 2;
}
// Returning the default value as -1
return -1;
}
/**
* This method returns the month string located at the supplied index
*/
function getMonth(date, index) {
var tokens = splitDateFormat(date);
return tokens[index];
}
/**
* This method gets the date index from the supplied format
*/
function getDateIndex(format) {
var tokens = splitDateFormat(format);
if (tokens[0] === 'DD'
|| tokens[0] === 'dd') {
return 0;
} else if (tokens[1] === 'DD'
|| tokens[1] === 'dd') {
return 1;
} else if (tokens[2] === 'DD'
|| tokens[2] === 'dd') {
return 2;
}
// Returning the default value as -1
return -1;
}
/**
* This method returns the date string located at the supplied index
*/
function getDate(date, index) {
var tokens = splitDateFormat(date);
return tokens[index];
}
/**
* This method returns true if date1 is before date2 else return false
*/
function isBefore(date1, date2, format) {
// Validating if date1 date is greater than the date2 date
if (new Date(getYear(date1, getYearIndex(format)),
getMonth(date1, getMonthIndex(format)) - 1,
getDate(date1, getDateIndex(format))).getTime()
> new Date(getYear(date2, getYearIndex(format)),
getMonth(date2, getMonthIndex(format)) - 1,
getDate(date2, getDateIndex(format))).getTime()) {
return true;
}
return false;
}
/**
* This method returns true if date1 is after date2 else return false
*/
function isAfter(date1, date2, format) {
// Validating if date2 date is less than the date1 date
if (new Date(getYear(date2, getYearIndex(format)),
getMonth(date2, getMonthIndex(format)) - 1,
getDate(date2, getDateIndex(format))).getTime()
< new Date(getYear(date1, getYearIndex(format)),
getMonth(date1, getMonthIndex(format)) - 1,
getDate(date1, getDateIndex(format))).getTime()
) {
return true;
}
return false;
}
/**
* This method returns true if date1 is equals to date2 else return false
*/
function isEquals(date1, date2, format) {
// Validating if date1 date is equals to the date2 date
if (new Date(getYear(date1, getYearIndex(format)),
getMonth(date1, getMonthIndex(format)) - 1,
getDate(date1, getDateIndex(format))).getTime()
=== new Date(getYear(date2, getYearIndex(format)),
getMonth(date2, getMonthIndex(format)) - 1,
getDate(date2, getDateIndex(format))).getTime()) {
return true;
}
return false;
}
/**
* This method validates and returns true if the supplied date is
* equals to the current date.
*/
function isCurrentDate(date, format) {
// Validating if the supplied date is the current date
if (new Date(getYear(date, getYearIndex(format)),
getMonth(date, getMonthIndex(format)) - 1,
getDate(date, getDateIndex(format))).getTime()
=== new Date(new Date().getFullYear(),
new Date().getMonth(),
new Date().getDate()).getTime()) {
return true;
}
return false;
}
/**
* This method validates and returns true if the supplied date value
* is before the current date.
*/
function isBeforeCurrentDate(date, format) {
// Validating if the supplied date is before the current date
if (new Date(getYear(date, getYearIndex(format)),
getMonth(date, getMonthIndex(format)) - 1,
getDate(date, getDateIndex(format))).getTime()
< new Date(new Date().getFullYear(),
new Date().getMonth(),
new Date().getDate()).getTime()) {
return true;
}
return false;
}
/**
* This method validates and returns true if the supplied date value
* is after the current date.
*/
function isAfterCurrentDate(date, format) {
// Validating if the supplied date is before the current date
if (new Date(getYear(date, getYearIndex(format)),
getMonth(date, getMonthIndex(format)) - 1,
getDate(date, getDateIndex(format))).getTime()
> new Date(new Date().getFullYear(),
new Date().getMonth(),
new Date().getDate()).getTime()) {
return true;
}
return false;
}
/**
* This method splits the supplied date OR format based
* on non alpha numeric characters in the supplied string.
*/
function splitDateFormat(dateFormat) {
// Spliting the supplied string based on non characters
return dateFormat.split(/\W/);
}
/*
* This method validates if the supplied value is a valid date.
*/
function isDate(date, format) {
// Validating if the supplied date string is valid and not a NaN (Not a Number)
if (!isNaN(new Date(getYear(date, getYearIndex(format)),
getMonth(date, getMonthIndex(format)) - 1,
getDate(date, getDateIndex(format))))) {
return true;
}
return false;
}
Below is the HTML snippet
<input type="text" name="start" id="start" size="10" value="05/31/2016" />
<br/>
<input type="text" name="end" id="end" size="10" value="04/28/2016" />
<br/>
<input type="button" value="Submit" onclick="javascript:validate('MM/dd/yyyy');" />
If your date needs to match DD.MM.YYYY and use AngularJS, use the following code:
$scope.validDate = function(value){
var matches = /^(\d{1,2})[.](\d{1,2})[.](\d{4})$/.exec(value);
if (matches == null) return false;
var d = matches[1];
var m = matches[2] - 1;
var y = matches[3];
var composedDate = new Date(y, m, d);
return composedDate.getDate() == d &&
composedDate.getMonth() == m &&
composedDate.getFullYear() == y;
};
console.log($scope.validDate('22.04.2001'));
console.log($scope.validDate('03.10.2001'));
console.log($scope.validDate('30.02.2001'));
console.log($scope.validDate('23.09.2016'));
console.log($scope.validDate('29.02.2016'));
console.log($scope.validDate('31.02.2016'));
More about the scope object can be found here. Without AngularJS, simply change the first line to:
ValidDate = new function(value) {
And call it using:
var MyDate= ValidDate('29.09.2016');
DateFormat = DD.MM.YYYY or D.M.YYYY
function dateValidate(val){
var dateStr = val.split('.');
var date = new Date(dateStr[2], dateStr[1]-1, dateStr[0]);
if(date.getDate() == dateStr[0] && date.getMonth()+1 == dateStr[1] && date.getFullYear() == dateStr[2])
{ return date; }
else{ return 'NotValid';}
}
try this:
function validateDate(dates){
re = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
var days=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
if(regs = dates.match(re)) {
// day value between 1 and 31
if(regs[1] < 1 || regs[1] > 31) {
return false;
}
// month value between 1 and 12
if(regs[2] < 1 || regs[2] > 12) {
return false;
}
var maxday=days[regs[2]-1];
if(regs[2]==2){
if(regs[3]%4==0){
maxday=maxday+1;
}
}
if(regs[1]>maxday){
return false;
}
return true;
}else{
return false;
}
}
German Variant, but could be adapted to Iso
export function isLeapYear(year) {
return (
year % 4 === 0 && (year % 100 != 0 || year % 1000 === 0 || year % 400 === 0)
)
}
export function isValidGermanDate(germanDate) {
if (
!germanDate ||
germanDate.length < 5 ||
germanDate.split('.').length < 3
) {
return false
}
const day = parseInt(germanDate.split('.')[0])
const month = parseInt(germanDate.split('.')[1])
const year = parseInt(germanDate.split('.')[2])
if (isNaN(month) || isNaN(day) || isNaN(year)) {
return false
}
if (month < 1 || month > 12) {
return false
}
if (day < 1 || day > 31) {
return false
}
if ((month === 4 || month === 6 || month === 9 || month === 11) && day > 30) {
return false
}
if (isLeapYear(year)) {
if (month === 2 && day > 29) {
return false
}
} else {
if (month === 2 && day > 28) {
return false
}
}
return true
}
Short and fast.
function dateValid(date) {
var match = date.match(/^(\d\d)-(\d\d)-(\d{4})$/) || [];
var m = (match[1] | 0) - 1;
var d = match[2] | 0;
var y = match[3] | 0;
return !(
m < 0 || // Before January
m > 11 || // After December
d < 1 || // Before the 1st of the month
d - 30 > (2773 >> m & 1) || // After the 30th or 31st of the month using bitmap
m == 1 && d - 28 > // After the 28th or 29th of February depending on leap year
(!(y % 4) && y % 100 || !(y % 400)));
}
console.log('02-29-2000', dateValid('02-29-2000'));
console.log('02-29-2001', dateValid('02-29-2001'));
console.log('12-31-1970', dateValid('12-31-1970'));
console.log('Hello', dateValid('Hello'));
Expanding on "Short and Fast" above by #Adam Leggett, as cases like "02/30/2020" return true when it should be false. I really dig the bitmap though...
For a MM/DD/YYYY date format validation:
const dateValid = (date) => {
const isLeapYear = (yearNum) => {
return ((yearNum % 100 === 0) ? (yearNum % 400 === 0) : (yearNum % 4 === 0))?
1:
0;
}
const match = date.match(/^(\d\d)\/(\d\d)\/(\d{4})$/) || [];
const month = (match[1] | 0) - 1;
const day = match[2] | 0;
const year = match[3] | 0;
const dateEval=!( month < 0 || // Before January
month > 11 || // After December
day < 1 || // Before the 1st of the month
day - 30 > (2773 >> month & 1) ||
month === 1 && day - 28 > isLeapYear(year)
// Day is 28 or 29, month is 02, year is leap year ==> true
);
return `\nDate: ${date}\n\n
Valid Date?: ${dateEval}\n
=======================================`
}
console.log(dateValid('02/28/2020')) // true
console.log(dateValid('02/29/2020')) // true
console.log(dateValid('02/30/2020')) // false
console.log(dateValid('01/31/2020')) // true
console.log(dateValid('01/31/2000')) // true
console.log(dateValid('04/31/2020')) // false
console.log(dateValid('04/31/2000')) // false
console.log(dateValid('04/30/2020')) // true
console.log(dateValid('01/32/2020')) // false
console.log(dateValid('02/28/2021')) // true
console.log(dateValid('02/29/2021')) // false
console.log(dateValid('02/30/2021')) // false
console.log(dateValid('02/28/2000')) // true
console.log(dateValid('02/29/2000')) // true
console.log(dateValid('02/30/2000')) // false
console.log(dateValid('02/28/2001')) // true
console.log(dateValid('02/29/2001')) // false
console.log(dateValid('02/30/2001')) // false
For a MM-DD-YYYY date format validation: Replace \/ in the pattern for match by -.
<script language = "Javascript">
// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
var minYear=1900;
var maxYear=2100;
function isInteger(s){
var i;
for (i = 0; i < s.length; i++){
// Check that current character is number.
var c = s.charAt(i);
if (((c < "0") || (c > "9"))) return false;
}
// All characters are numbers.
return true;
}
function stripCharsInBag(s, bag){
var i;
var returnString = "";
// Search through string's characters one by one.
// If character is not in bag, append to returnString.
for (i = 0; i < s.length; i++){
var c = s.charAt(i);
if (bag.indexOf(c) == -1) returnString += c;
}
return returnString;
}
function daysInFebruary (year){
// February has 29 days in any year evenly divisible by four,
// EXCEPT for centurial years which are not also divisible by 400.
return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
for (var i = 1; i <= n; i++) {
this[i] = 31
if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
if (i==2) {this[i] = 29}
}
return this
}
function isDate(dtStr){
var daysInMonth = DaysArray(12)
var pos1=dtStr.indexOf(dtCh)
var pos2=dtStr.indexOf(dtCh,pos1+1)
var strDay=dtStr.substring(0,pos1)
var strMonth=dtStr.substring(pos1+1,pos2)
var strYear=dtStr.substring(pos2+1)
strYr=strYear
if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
for (var i = 1; i <= 3; i++) {
if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
}
month=parseInt(strMonth)
day=parseInt(strDay)
year=parseInt(strYr)
if (pos1==-1 || pos2==-1){
alert("The date format should be : dd/mm/yyyy")
return false
}
if (strMonth.length<1 || month<1 || month>12){
alert("Please enter a valid month")
return false
}
if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
alert("Please enter a valid day")
return false
}
if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
return false
}
if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
alert("Please enter a valid date")
return false
}
return true
}
function ValidateForm(){
var dt=document.frmSample.txtDateenter code here
if (isDate(dt.value)==false){
dt.focus()
return false
}
return true
}
</script>

Categories

Resources