Javascript: comment valider les dates au format MM-DD-AAAA?

J'ai vu une réponse potentielle ici, mais c'était pour YYYY-MM-DD: Validation de la date de JavaScript

J'ai modifié le code ci-dessus pour MM-DD-AAAA comme ça, mais je ne peux toujours pas le faire fonctionner:

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])); } 

Comment puis-je utiliser le code ci-dessus pour MM-DD-YYYY et mieux encore MM / DD / AAAA?

Merci.

 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')); 

Ça marche. (Testé avec Firebug, d'où la 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; } 

Cela vérifie les jours valides dans chaque mois et pour les jours valables valables.

Qu'en est-il de la validation des dates dans le format de la date «ANY»? J'ai utilisé la bibliothèque DateJS et l'ai ajoutée aux formulaires existants pour m'assurer que j'obtiens des dates et des heures validées comme je le souhaite. L'utilisateur peut même entrer des choses comme "maintenant" et "demain" et il sera converti en une date valide.

Voici la bibliothèque dateJS: http://www.datejs.com/

Et voici un conseil jQuery que j'ai écrit: http://www.ssmedia.com/utilities/jquery/index.cfm/datejs.htm

J'utilise ce regex pour valider MM-DD-AAAA:

 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; } } 

Il ne correspond qu'à des mois valides et vous pouvez utiliser / – ou. Comme séparateurs.

J'utiliserais Moment.js pour cette tâche. Il est très facile d'analyser les dates et il fournit également un support pour détecter une date invalide 1 au format correct. Par exemple, considérez cet exemple :

 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) 

Le premier moment(.., formats) permet d'analyser l'entrée en fonction du format localisé fourni. Ensuite, la fonction isValid est appelée sur l'objet moment résultant afin que nous puissions vraiment dire si c'est une date valide .

Ceci peut être utilisé pour dériver trivialement la méthode isValidDate:

 String.prototype.isValidDate = function() { var formats = ['MM-DD-YYYY', 'MM/DD/YYYY']; return moment("" + this, formats).isValid(); } 

1 Comme je peux trouver peu de commentaires sur la question, je n'utilisais que moment.js pour les dates couvertes par le calendrier grégorien . Il peut y avoir des plugins pour d'autres calendriers (y compris historiques ou scientifiques).

Qu'est-ce qui ne fonctionne pas? Voici une version testée:

 String.prototype.isValidDate = function() { var match = this.match(/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/); var 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 

Manière simple de résoudre

 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); 

Vous pouvez simplifier un peu en modifiant les deux premières lignes de la fonction:

 var matches = this.match(/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/); 

Ou, modifiez simplement le paramètre sur le constructeur RegExp pour être

 ^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$ 

Cette fonction valide la date pour voir si elle est correcte ou si elle est dans le format approprié: DD / MM / AAAA.

 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')); 

Passe cette fonction à ce jour avec le format // 10-10-2012 et l'identifiant de l'objet.

 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(''); } } } 

Ceci est pour valider la chaîne de la date en formate dd.mm.yyyy Il est facile de le personnaliser. Il suffit d'ajuster pos1 et pos2 dans 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> 

Veuillez trouver dans le code ci-dessous qui permet d'effectuer la validation de la date pour l'un des formats fournis ou en fonction des paramètres régionaux de l'utilisateur pour valider le début / la fin et la fin des dates. Il pourrait y avoir de meilleures approches, mais elles ont été mises en place. L'ont testé pour les formats suivants: MM / jj / aaaa, dd / MM / aaaa, aaaa-MM-jj, aaaa.M.d., aaaa / MM / jj et jj-MM-aaaa.

Le format de la date fournie et la chaîne de la date vont de pair.

 <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; } 

Voici l'extrait HTML

  <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');" /> 

Si votre date doit correspondre à DD.MM.YYYY et utiliser AngularJS, utilisez le code suivant:

 $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')); 

Vous trouverez plus d'informations sur l'objet de portée ici . Sans AngularJS, modifiez simplement la première ligne pour:

 ValidDate = new function(value) { 

Et appelez-le en utilisant:

 var MyDate= ValidDate('29.09.2016'); 

DateFormat = DD.MM.YYYY ou DMYYYY

 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';} } 

essaye ça:

 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; } } 
 <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>