我试图以这种格式验证日期:(yyyy-mm-dd)。我找到了这个解决方案,但它的格式与我需要的格式不同,如:(mm / dd / yyyy)。
以下是该解决方案的链接:http://jsfiddle.net/ravi1989/EywSP/848/
我的代码如下:
function isDate(txtDate)
{
var currVal = txtDate;
if(currVal == '')
return false;
var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/; //Declare Regex
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;
}
我可以使用哪种正则表达式模式来解释无效日期和闰年?
答案 0 :(得分:48)
我稍微扩展了上面发布的isValidDate函数Thorbin(使用正则表达式)。我们使用正则表达式来检查格式(以防止我们获得另一种对Date有效的格式)。在这个松散检查之后,我们实际上通过Date构造函数运行它,如果在这种格式下有效,则返回true或false。如果它不是有效日期,我们将从此函数中获取错误。
function isValidDate(dateString) {
var regEx = /^\d{4}-\d{2}-\d{2}$/;
if(!dateString.match(regEx)) return false; // Invalid format
var d = new Date(dateString);
var dNum = d.getTime();
if(!dNum && dNum !== 0) return false; // NaN value, Invalid date
return d.toISOString().slice(0,10) === dateString;
}
/* Example Uses */
console.log(isValidDate("0000-00-00")); // false
console.log(isValidDate("2015-01-40")); // false
console.log(isValidDate("2016-11-25")); // true
console.log(isValidDate("1970-01-01")); // true = epoch
console.log(isValidDate("2016-02-29")); // true = leap day
console.log(isValidDate("2013-02-29")); // false = not leap day
答案 1 :(得分:18)
如果这对你来说足够了,你也可以使用正则表达式完成一个稍微简单的工作(例如[1]中所见)。
它们内置于javascript中,因此您可以在没有任何库的情况下使用它们。
function isValidDate(dateString) {
var regEx = /^\d{4}-\d{2}-\d{2}$/;
return dateString.match(regEx) != null;
}
将检查给定字符串是否为四个数字 - 两个数字 - 两个数字(几乎为yyyy-mm-dd)。但是你可以用更复杂的表达式做更多的事情,例如检查[2]。
isValidDate("23-03-2012") // false
isValidDate("1987-12-24") // true
isValidDate("22-03-1981") // false
isValidDate("0000-00-00") // true
答案 2 :(得分:10)
由于标记了jQuery,因此这是一种简单/用户友好的方式来验证必须是日期的字段(您需要jQuery validation plugin):
HTML 的
<form id="frm">
<input id="date_creation" name="date_creation" type="text" />
</form>
的jQuery
$('#frm').validate({
rules: {
date_creation: {
required: true,
date: true
}
}
});
更新:经过一番挖掘后,我发现没有可用于设置特定日期格式的准备参数的证据。
但是,您可以在自定义规则中插入所选的正则表达式:)
$.validator.addMethod(
"myDateFormat",
function(value, element) {
// yyyy-mm-dd
var re = /^\d{4}-\d{1,2}-\d{1,2}$/;
// valid if optional and empty OR if it passes the regex test
return (this.optional(element) && value=="") || re.test(value);
}
);
$('#frm').validate({
rules: {
date_creation: {
// not optional
required: true,
// valid date
date: true
}
}
});
此新规则意味着您的标记更新:
<input id="date_creation" name="date_creation" type="text" class="myDateFormat" />
答案 3 :(得分:5)
试试这个Here is working Demo:
$(function() {
$('#btnSubmit').bind('click', function(){
var txtVal = $('#txtDate').val();
if(isDate(txtVal))
alert('Valid Date');
else
alert('Invalid Date');
});
function isDate(txtDate)
{
var currVal = txtDate;
if(currVal == '')
return false;
var rxDatePattern = /^(\d{4})(\/|-)(\d{1,2})(\/|-)(\d{1,2})$/; //Declare Regex
var dtArray = currVal.match(rxDatePattern); // is format OK?
if (dtArray == null)
return false;
//Checks for mm/dd/yyyy format.
dtMonth = dtArray[3];
dtDay= dtArray[5];
dtYear = dtArray[1];
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;
}
});
改变了正则表达式:
var rxDatePattern = /^(\d{4})(\/|-)(\d{1,2})(\/|-)(\d{1,2})$/; //Declare Regex
答案 4 :(得分:3)
我建议使用 使用jquery验证插件和jquery ui日期选择器
jQuery.validator.addMethod("customDateValidator", function(value, element) {
// dd-mm-yyyy
var re = /^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$/ ;
if (! re.test(value) ) return false
// parseDate throws exception if the value is invalid
try{jQuery.datepicker.parseDate( 'dd-mm-yy', value);return true ;}
catch(e){return false;}
},
"Please enter a valid date format dd-mm-yyyy"
);
this.ui.form.validate({
debug: true,
rules : {
title : { required : true, minlength: 4 },
date : { required: true, customDateValidator: true }
}
}) ;
使用Jquery和日期选择器只需使用
创建一个函数// dd-mm-yyyy
var re = /^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$/ ;
if (! re.test(value) ) return false
// parseDate throws exception if the value is invalid
try{jQuery.datepicker.parseDate( 'dd-mm-yy', value);return true ;}
catch(e){return false;}
您可能只使用正则表达式进行验证
// dd-mm-yyyy
var re = /^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$/ ;
return re.test(value)
当然,日期格式应属于您所在的地区
答案 5 :(得分:2)
这是YYYY-MM-DD格式的JavaScript代码
/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/
答案 6 :(得分:2)
moment(dateString, 'YYYY-MM-DD', true).isValid() ||
moment(dateString, 'YYYY-M-DD', true).isValid() ||
moment(dateString, 'YYYY-MM-D', true).isValid();
答案 7 :(得分:1)
将正则表达式重新排列为:
/^(\d{4})([\/-])(\d{1,2})\2(\d{1,2})$/
我做的不仅仅是重新安排条款,我还做了它,以便它不接受像yyyy-mm/dd
这样的“破损”日期。
之后,您需要调整dtMonth
等变量,如下所示:
dtYear = dtArray[1];
dtMonth = dtArray[3];
dtDay = dtArray[4];
之后,代码应该可以正常工作。
答案 8 :(得分:0)
工作演示小提琴 Demo
将验证功能更改为此
function isDate(txtDate)
{
return txtDate.match(/^d\d?\/\d\d?\/\d\d\d\d$/);
}
答案 9 :(得分:0)
只需使用Date
构造函数与字符串输入进行比较:
function isDate(str) {
return 'string' === typeof str && (dt = new Date(str)) && !isNaN(dt) && str === dt.toISOString().substr(0, 10);
}
console.log(isDate("2018-08-09"));
console.log(isDate("2008-23-03"));
console.log(isDate("0000-00-00"));
console.log(isDate("2002-02-29"));
console.log(isDate("2004-02-29"));
已编辑:回复其中一项评论
嗨,它在IE8上不起作用,您是否有针对– Mehdi Jalal的解决方案
function pad(n) {
return (10 > n ? ('0' + n) : (n));
}
function isDate(str) {
if ('string' !== typeof str || !/\d{4}\-\d{2}\-\d{2}/.test(str)) {
return false;
}
var dt = new Date(str.replace(/\-/g, '/'));
return dt && !isNaN(dt) && 0 === str.localeCompare([dt.getFullYear(), pad(1 + dt.getMonth()), pad(dt.getDate())].join('-'));
}
console.log(isDate("2018-08-09"));
console.log(isDate("2008-23-03"));
console.log(isDate("0000-00-00"));
console.log(isDate("2002-02-29"));
console.log(isDate("2004-02-29"));
答案 10 :(得分:-1)
你可以将它用于YYYY-MM-DD。它检查它是否是有效日期并且该值不是NULL。如果检查结果是正确的,则返回TRUE
;如果任何内容无效,则返回FALSE
。它没有比这更容易了!
function validateDate(date) {
var matches = /^(\d{4})[-\/](\d{2})[-\/](\d{2})$/.exec(date);
if (matches == null) return false;
var d = matches[3];
var m = matches[2] - 1;
var y = matches[1] ;
var composedDate = new Date(y, m, d);
return composedDate.getDate() == d &&
composedDate.getMonth() == m &&
composedDate.getFullYear() == y;
}
请注意,需要按月删除几个月:var m = matches[2] - 1;
否则new Date()
实例无法正常制作。