我使用正则表达式来匹配日期格式。并从日期中提取年,月,日期。但我无法在这里获得完整的年份价值。如果我输入2013-02-29
而不是20
,而不是2013
。我在这里尝试的是: -
$(document).ready(function(){
var dateVal = '2013-06-01';
var rxDatePattern = /^(19|20)\d\d(-)(0[1-9]|1[012])(-)(0[1-9]|[12][0-9]|3[01])$/;
var dtArray = dateVal.match(rxDatePattern);
dtYear = dtArray[1];
dtMonth = dtArray[3];
dtDay = dtArray[5];
jQuery.each(dtArray, function(index, value) {
console.log(index + ': ' + value);
});
});
我得到输出: -
0: 2013-06-01
1: 20
2: -
3: 06
4: -
5: 01
这里是小提琴:http://jsfiddle.net/roop1886/rYh8N/1/
以下是我使用上述代码的完整代码: -
//varify date formate
jQuery.validator.addMethod(
"siteDateValidator",
function (value, element) {
var currVal = value;
if (currVal != '') {
var rxDatePattern = /^(19|20)\d\d(-)(0[1-9]|1[012])(-)(0[1-9]|[12][0-9]|3[01])$/;
var dtArray = currVal.match(rxDatePattern);
if (dtArray == null) {
return false;
}
dtYear = (dtArray[1]);
dtMonth = (dtArray[3]);
dtDay = (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;
},
"Please enter a valid date, date format should be(yyyy-mm-dd) and year should be greater than equal to 1900."
);
答案 0 :(得分:4)
为什么不在javascript Date类中使用构建?
var d = new Date("2013-02-29");
d.getFullYear(); // 2013
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
<强>更新强> 您可以通过调用:
来检测给定日期是否无效var valid = !isNaN(d.getTime()); // returns true if valid, false if invalid
答案 1 :(得分:1)
为什么不使用split()?
var dateVal = '2013-02-29';
var dtArray = dateVal.split("-");
dtYear = (dtArray[0]);
dtMonth = (dtArray[1]);
dtDay = (dtArray[2]);
alert(dtYear);
alert(dtMonth);
alert(dtDay);
答案 2 :(得分:1)
这样的事情:
var dateVal = '2013-06-01';
var parts = dateVal.match(/(\d{4})-(\d{2})-(\d{2})/)
var testDate = new Date(parts[1], parts[2] - 1, parts[3])
var isFormatValid = parts[1] == testDate.getFullYear() && // format check
parts[2] == testDate.getMonth () + 1 &&
parts[3] == testDate.getDate ()
var isBusinessValid = isFormatValid && parts[1] >= 1900; // business related
alert(dateVal + "\n" + testDate + "\n" + isFormatValid + "\n" + isBusinessValid)
在这种情况下,您不需要在正则表达式中处理完整日期支持,只需提取相关部分,构建Date
对象并与输入的输入进行比较。 Javascript会关心闰年和你的东西。
答案 3 :(得分:1)
这是一个简单的答案:
var rxDatePattern = /^(19[\d]{2}|20[\d]{2})(\-)(0[1-9]|1[012])(\-)(0[1-9]|[12][0-9]|3[01])$/;
答案 4 :(得分:1)
替换您错过的年份分组的正则表达式。它应该是(?:19|20)\d\d)
而不是(19|20)\d\d
/^((?:19|20)\d\d)(-)(0[1-9]|1[012])(-)(0[1-9]|[12][0-9]|3[01])$/
这是工作小提琴: - http://jsfiddle.net/roop1886/rYh8N/2/
答案 5 :(得分:0)
如果要验证日期和格式,可以使用:
// Validate date in format yyyy-mm-dd
// Leading zeros on single digit months and days are optional
function validateDate(dateString) {
var s = dateString.split('-');
var d = new Date(s[0], --s[1], s[2]);
return d && d.getFullYear() == s[0] && d.getDate() == s[2];
}
如果你想检查单个数字的月份和日期是否有前导零,那就去吧,但我没有看到这一点。