Javascript:如何validationMM-DD-YYYY格式的date?

我在这里看到了一个可能的答案,但这是YYYY-MM-DD: JavaScriptdatevalidation

我修改了上面的MM-DD-YYYY的代码,就像这样,但我仍然无法使它工作:

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

我怎样才能得到上面的代码工作MM-DD-YYYY和更好的MM / DD / YYYY?

谢谢。

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

有用。 (用Firebugtesting,因此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; } 

这将检查每个月的有效date和闰年有效date。

如何validation“ANY”date格式的date? 我一直在使用DateJS库,并将其添加到现有的表单,以确保我得到有效的date和时间格式我想要的方式。 用户甚至可以input“now”和“tomorrow”之类的东西,并将其转换为有效date。

这里是dateJS库: http ://www.datejs.com/

这里有一个我写的jQuery提示: http : //www.ssmedia.com/utilities/jquery/index.cfm/datejs.htm

我会使用Moment.js来完成这个任务。 它使parsingdate变得非常简单 ,并且还提供了以正确格式检测无效date1的支持。 例如,考虑这个例子 :

 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) 

首先moment(.., formats)用于根据提供的本地化格式parsinginput。 然后在生成的时刻对象上调用isValid函数,以便我们可以实际判断它是否是有效的date。

这可以用来平凡的派生isValidDate方法:

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

1因为我在这个问题上只能find一点小小的评论,所以我只会使用公历所涵盖的date 。 其他(包括历史或科学)日历可能有插件。

我使用这个正则expression式来validationMM-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; } } 

它只会匹配有效月份,您可以使用/ – 或。 作为分隔符。

什么是不工作呢? 这里是一个testing版本:

 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 

简单的方法来解决

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

你可以通过改变函数的前两行来简化它:

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

或者,只需将该参数更改为RegExp构造函数即可

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

此function将validationdate以查看是否正确,或者是否使用正确的格式: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')); 

以格式// 10-10-2012和对象的ID传递此函数。

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

这是为了validation在formate中的datestringdd.mm.yyyy很容易定制它。 你只需要调整isValidDate()中的pos1和pos2。

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> 

请在下面的代码中find它可以执行任何提供的格式的datevalidation或基于用户区域设置来validation开始/结束/到date。 可能有一些更好的方法,但已经拿出了这个。 已经testing过的格式如:MM / dd / yyyy,dd / MM / yyyy,yyyy-MM-dd,yyyy.MM.dd,yyyy / MM / dd和dd-MM-yyyy。

注意提供的date格式和datestring齐头并进。

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

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

如果您的date需要匹配DD.MM.YYYY并使用AngularJS,请使用以下代码:

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

关于范围对象的更多信息可以在这里find。 没有AngularJS,只需将第一行改为:

 ValidDate = new function(value) { 

并使用它来调用它:

 var MyDate= ValidDate('29.09.2016'); 

DateFormat = DD.MM.YYYY或者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';} } 

尝试这个:

 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>