如何validationdate?

我试图testing,以确保date是有效的,如果有人进入2/30/2011那么它应该是错的。

我怎样才能做到这一点与任何date?

validationdatestring的一个简单方法是转换为date对象并进行testing,例如

 // Expect input as d/m/y function isValidDate(s) { var bits = s.split('/'); var d = new Date(bits[2], bits[1] - 1, bits[0]); return d && (d.getMonth() + 1) == bits[1]; } ['0/10/2017','29/2/2016'].forEach(function(s) { console.log(s + ' : ' + isValidDate(s)) }) 

第一个函数isValidDate(s)由RobG提出将工作inputstring'1/2 /'? 我想不是,因为年没有validation;(

我的build议是使用这个函数的改进版本:

 //input in ISO format: yyyy-MM-dd function DatePicker_IsValidDate(input) { var bits = input.split('-'); var d = new Date(bits[0], bits[1] - 1, bits[2]); return d.getFullYear() == bits[0] && (d.getMonth() + 1) == bits[1] && d.getDate() == Number(bits[2]); } 
 var isDate_ = function(input) { var status = false; if (!input || input.length <= 0) { status = false; } else { var result = new Date(input); if (result == 'Invalid Date') { status = false; } else { status = true; } } return status; } 

这个函数返回给定input是否是有效date的bool值。 例如:

 if(isDate_(var_date)) { // statements if the date is valid } else { // statements if not valid } 

这个解决scheme没有涉及明显的datevalidation,例如确保date部分是整数,或date部分符合明显的validation检查,例如当天大于0且小于32.此解决scheme假定您已经具有全部三个date部分年,月,日),每个人都已经通过了明显的validation。 鉴于这些假设,这种方法应该只是检查date是否存在。

例如2009年2月29日不是真实的date,而是2008年2月29日。 当你创build一个新的Date对象,例如2009年2月29日,看看会发生什么(记住,从JavaScript开始的零个月):

 console.log(new Date(2009, 1, 29)); 

以上线路输出: Sun Mar 01 2009 00:00:00 GMT-0800(PST)

注意date如何简单地转到下个月的第一天。 假设你有其他明显的validation,这个信息可以用来确定一个date是否真实与下面的function(这个function允许非零基于月更方便的input):

 var isActualDate = function (month, day, year) { var tempDate = new Date(year, --month, day); return month === tempDate.getMonth(); }; 

这不是一个完整的解决scheme,并没有考虑到i18n,但它可以变得更加健壮。

我只是做一个RobG解决scheme的重制

 var daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]; var isLeap = new Date(theYear,1,29).getDate() == 29; if (isLeap) { daysInMonth[1] = 29; } return theDay <= daysInMonth[--theMonth] 

我的函数返回true,如果是有效的date,否则返回false:D

 function isDate (day, month, year){ if(day == 0 ){ return false; } switch(month){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(day > 31) return false; return true; case 2: if (year % 4 == 0) if(day > 29){ return false; } else{ return true; } if(day > 28){ return false; } return true; case 4: case 6: case 9: case 11: if(day > 30){ return false; } return true; default: return false; } } console.log(isDate(30, 5, 2017)); console.log(isDate(29, 2, 2016)); console.log(isDate(29, 2, 2015)); 

这是JS6(让声明)。

 function checkExistingDate(year, month, day){ // year, month and day should be numbers // months are intended from 1 to 12 let months31 = [1,3,5,7,8,10,12]; // months with 31 days let months30 = [4,6,9,11]; // months with 30 days let months28 = [2]; // the only month with 28 days (29 if year isLeap) let isLeap = ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0); let valid = (months31.indexOf(month)!==-1 && day <= 31) || (months30.indexOf(month)!==-1 && day <= 30) || (months28.indexOf(month)!==-1 && day <= 28) || (months28.indexOf(month)!==-1 && day <= 29 && isLeap); return valid; // it returns true or false } 

在这种情况下,我打算从1到12个月。如果你喜欢或使用基于0-11的模型,你可以改变数组:

 let months31 = [0,2,4,6,7,9,11]; let months30 = [3,5,8,10]; let months28 = [1]; 

如果您的dateforms为dd / mm / yyyy,则可以取消日,月和年function参数,然后执行以下操作以检索它们:

 let arrayWithDayMonthYear = myDateInString.split('/'); let year = parseInt(arrayWithDayMonthYear[2]); let month = parseInt(arrayWithDayMonthYear[1]); let day = parseInt(arrayWithDayMonthYear[0]); 
 function isValidDate(year, month, day) { var d = new Date(year, month - 1, day, 0, 0, 0, 0); return (!isNaN(d) && (d.getDate() == day && d.getMonth() + 1 == month && d.getYear() == year)); }