1

我正在使用正则表达式来匹配日期格式。并从日期中提取年、月、日。但我无法在这里获得全年价值。如果我进入而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."
);
4

6 回答 6

7

为什么不使用 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
于 2013-06-06T12:34:10.920 回答
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/

于 2013-06-06T12:53:41.827 回答
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);
于 2013-06-06T12:39:35.213 回答
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 会为你关心闰年和其他东西。

于 2013-06-06T12:43:28.990 回答
1

这是简单的答案:

var rxDatePattern = /^(19[\d]{2}|20[\d]{2})(\-)(0[1-9]|1[012])(\-)(0[1-9]|[12][0-9]|3[01])$/;
于 2013-06-06T12:44:29.683 回答
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];
}

如果你想检查个位数的月份和日期是否有前导零,那就去吧,但我不明白这一点。

于 2013-06-06T12:49:51.970 回答