允许错误字符的Javascript日期验证

时间:2012-12-13 12:17:37

标签: javascript validation date

出于某种原因,我的日期验证允许传递fullstops,但仅在该日期的那一部分结束时,例如12./10/201获得通过,但1.2 / 10/201没有通过。

这是我的代码:

var iDate = $("check_date").value;

  if(iDate.length > 0) {
    var a = iDate.split("/"); 
    if(isValidDate(a[0],a[1]-1,a[2]) == false){
      alert("You have entered an invalid date.");
      return false;
    }

isValidDate = function(day,month,year) {
  var dteDate;
  dteDate=new Date(year,month,day);
  return ((day==dteDate.getDate()) && (month==dteDate.getMonth()) && (year==dteDate.getFullYear()));
}

有什么想法吗?

5 个答案:

答案 0 :(得分:2)

您可以使用函数检查日期是否有效。看看这段代码:

function isDate(dateStr) {
    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
    var matchArray = dateStr.match(datePat); // is the format ok?

    if (matchArray == null) {
        alert("Please enter date as either mm/dd/yyyy or mm-dd-yyyy.");
        return false;
    }

    month = matchArray[1]; // p@rse date into variables
    day = matchArray[3];
    year = matchArray[5];

    if (month < 1 || month > 12) { // check month range
        alert("Month must be between 1 and 12.");
        return false;
    }

    if (day < 1 || day > 31) {
        alert("Day must be between 1 and 31.");
        return false;
    }

    if ((month==4 || month==6 || month==9 || month==11) && day==31) {
        alert("Month "+month+" doesn`t have 31 days!")
        return false;
    }

    if (month == 2) { // check for february 29th
        var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
        if (day > 29 || (day==29 && !isleap)) {
            alert("February " + year + " doesn`t have " + day + " days!");
            return false;
        }
    }
    return true; // date is valid
}

答案 1 :(得分:1)

正如评论中所讨论的,这是解决方案:

isValidDate = function(day,month,year) {
    var dteDate;
    dteDate=new Date(year,month,day);
    return ((day.toString()===dteDate.getDate().toString()) && (month.toString()===dteDate.getMonth().toString()) && (year.toString()===dteDate.getFullYear().toString()));
}

您还需要toString()方法,就像比较"12"12一样,它们将不相等。现在,您将"12""12"进行比较,这对于有效日期将是相等的。

答案 2 :(得分:0)

这是因为"12."在将字符串解析为数字时解释为12(这在内部发生,在日期对象中)。
试试这个:

if(isValidDate(a[0],a[1]-1,a[2]) == false && iDate.indexOf('.') == -1){

基本上,只需检查点。

答案 3 :(得分:0)

  1. 是有效号码。传递给Date构造函数后,它转换为Number为12.0,它显然等于12. 1.2不是。我建议你首先匹配正则表达式,然后像你一样检查部件的正确性。
  2. 我建议你实施这样的事情:

    function isValidDate(dateString)
    {
        if(! dateString.match(/((1[0-2])|(0?\d))\/(([0-2]?\d)|(3[0-1]))/(\d\d)?\d\d/) )
            return false;
    
        var parts = dateString.split("/");
        var dateToCheck = new Date(parts[0],parts[1]-1,parts[2]);
    
        return ((parts[0]==dateToCheck.getDate()) && (parts[1]==dateToCheck.getMonth()+1) && (parts[2]==dateToCheck.getFullYear()));
    }
    

答案 4 :(得分:0)

这是我的日期验证版本。即使有人打算输入,也不允许输入错误的日期。这也将在月/日之后自动填充。

$("#date").keyup(function (e) {
                // validation for length max 10
                var temp = $(this).val();
                if (temp.length > 10) $(this).val(temp.substring(0, temp.length - 1));

                var key = String.fromCharCode(e.keyCode);
                console.log(key + " " + e.keyCode);
                var regex = /[0-9]|[a-i]|\/|\`|\o|\¿|\%|\'|\$/;                            
                // checking teh allowed character
                if (!regex.test(key)) {
                    // checking backspace and shift key ( need to allow)
                    if (e.keyCode != 8 && e.keyCode != 16) {
                        var tam = $(this).val().length;
                        $(this).val(temp.substring(0, tam - 1));
                    }
                }
                else {
                    //if its not backslash
                    if (e.keyCode != 191 && e.keyCode != 111) {
                        if ($(this).val().length == 2) {
                            $(this).val($(this).val() + "/");
                        } else if ($(this).val().length == 5) {
                            $(this).val($(this).val() + "/");
                        }
                    }
                    else {
                        // if backslash
                        if ($(this).val().length != 3 && $(this).val().length != 6) {
                            var tam = $(this).val().length;
                            $(this).val(temp.substring(0, tam - 1));
                        }
                    }
                }
            });