Javascript 通过jQuery验证日期字符串格式的最佳方法
我找到了很多链接来验证字符串是否为日期 喜欢和 但无论如何,我不知道如何验证我们是否有这样的东西: 2012年6月6日其中第一个6是月,第二个6是天 如果用户这样输入: 2012年6月6日 有什么线索可以用正确的方式来做吗Javascript 通过jQuery验证日期字符串格式的最佳方法,javascript,jquery,jquery-validate,Javascript,Jquery,Jquery Validate,我找到了很多链接来验证字符串是否为日期 喜欢和 但无论如何,我不知道如何验证我们是否有这样的东西: 2012年6月6日其中第一个6是月,第二个6是天 如果用户这样输入: 2012年6月6日 有什么线索可以用正确的方式来做吗 谢谢 在这里,这应该适用于任何带有4位年份和任何分隔符的日期格式。我从我的插件中提取了它,该插件可以验证日期等等 var isValidDate = function (value, userFormat) { var userFormat = userFormat
谢谢 在这里,这应该适用于任何带有4位年份和任何分隔符的日期格式。我从我的插件中提取了它,该插件可以验证日期等等
var isValidDate = function (value, userFormat) {
var
userFormat = userFormat || 'mm/dd/yyyy', // default format
delimiter = /[^mdy]/.exec(userFormat)[0],
theFormat = userFormat.split(delimiter),
theDate = value.split(delimiter),
isDate = function (date, format) {
var m, d, y
for (var i = 0, len = format.length; i < len; i++) {
if (/m/.test(format[i])) m = date[i]
if (/d/.test(format[i])) d = date[i]
if (/y/.test(format[i])) y = date[i]
}
return (
m > 0 && m < 13 &&
y && y.length === 4 &&
d > 0 && d <= (new Date(y, m, 0)).getDate()
)
}
return isDate(theDate, theFormat)
}
var isValidDate=函数(值,用户格式){
变量
userFormat=userFormat | |‘mm/dd/yyyy’,//默认格式
分隔符=/[^mdy]/.exec(userFormat)[0],
格式=userFormat.split(分隔符),
日期=值。拆分(分隔符),
isDate=函数(日期、格式){
变量m,d,y
for(变量i=0,len=format.length;i0&&m<13&&
y&&y.length==4&&
d>0&&d使用正则表达式
var dateRegEx = /^(0[1-9]|1[012]|[1-9])[- /.](0[1-9]|[12][0-9]|3[01]|[1-9])[- /.](19|20)\d\d$/
console.log("06/06/2012".match(dateRegEx) !== null) // true
console.log("6/6/2012".match(dateRegEx) !== null) // true
console.log("6/30/2012".match(dateRegEx) !== null) // true
console.log("30/06/2012".match(dateRegEx) !== null) // false
编辑-免责声明
正如@elclanrs所指出的,这只验证字符串的格式,而不是实际日期,这意味着2月31日这样的日期会过去。然而,由于OP只要求“验证日期字符串格式”,我将把这个答案保留在这里,因为对于某些人来说,这可能就是你所需要的
需要注意的是,OP使用的方法也只验证格式
最后,对于那些想知道,如果您需要验证日期,而不仅仅是格式,则此正则表达式在(1-12)/(1-31)/(1900-2099)日期字符串的域中会有~2%的失败率。请不要在JPL的关键任务代码中使用此选项。这不会对所有情况都适用,例如console.log(“11/31/2012”。match(dateRegEx))//true
@elclars嗯……这不是一个有效的(M)M/(D)D/YYYY日期字符串吗?你是说它应该返回false吗?好吧,11月没有31天……所以是的,我想它应该返回false。@elclars-啊哈!很好的捕获…有时很容易超越自己。