使用JQuery Validate以dd / mm / yyyy格式验证日期

时间:2014-06-24 07:01:36

标签: javascript jquery validation date datetime

我正在记录出生日期和死亡日期。需要验证

  1. 死亡日期应超过出生日期
  2. 日期格式为dd / mm / yyyy
  3. 日期小于或等于今天。
  4. 验证无法按预期工作,无法解决问题。请帮忙。

    Fiddle code

    JS库使用

    1. Calendar / Datepicker的JQuery UI
    2. JQuery验证表单验证
    3. 验证库的其他方法

      var today = new Date();
      var authorValidator = $("#itemAuthorForm").validate({
      rules : {
          dateOfBirth : {
              required : false,
              date : true,
              dateITA : true,
              dateLessThan : '#expiredDate'
          },
          expiredDate : {
              required : false,
              date : true,
              dateITA : true,
              dateGreaterThan : "#dateOfBirth"
          }
      },
      onfocusout : function(element) {
          if ($(element).val()) {
              $(element).valid();
          }
      }
      });
      var dateOptionsDOE = {
      maxDate : today,
      dateFormat : "dd/mm/yy",
      changeMonth : true,
      changeYear : true,
      onClose : function(selectedDate) {
          $("#dateOfBirth").datepicker("option", "maxDate", selectedDate);
      }
      };
      var dateOptionsDOB = {
      maxDate : today,
      dateFormat : "dd/mm/yy",
      changeMonth : true,
      changeYear : true,
      onClose : function(selectedDate) {
          $("#expiredDate").datepicker("option", "minDate", selectedDate);
      }
       };
      
      jQuery.validator.addMethod("dateGreaterThan",
      function(value, element, params) {
      if ($(params).val() === "")
          return true;
      
      if (!/Invalid|NaN/.test(new Date(value))) {
          return new Date(value) > new Date($(params).val());
      }
      return isNaN(value) && isNaN($(params).val())
              || (Number(value) > Number($(params).val()));
              }, 'Must be greater than {0}.');
              jQuery.validator.addMethod("dateLessThan",
              function(value, element, params) {
      if ($(params).val() === "")
          return true;
      
      if (!/Invalid|NaN/.test(new Date(value))) {
          return new Date(value) < new Date($(params).val());
      }
      
      return isNaN(value) && isNaN($(params).val())
              || (Number(value) < Number($(params).val()));
              }, 'Must be less than {0}.');
              $("#expiredDate").datepicker(
          $.extend({}, $.datepicker.regional['en-GB'], dateOptionsDOE));
              $("#dateOfBirth").datepicker(
          $.extend({}, $.datepicker.regional['en-GB'], dateOptionsDOB));
      

6 个答案:

答案 0 :(得分:25)

这也将在闰年检查。这是纯正则表达式,因此它比任何lib都快(也比moment.js快)。但是如果你要在你的代码中使用很多日期,我建议你使用moment.js

var dateRegex = /^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-.\/])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;

console.log(dateRegex.test('21/01/1986'));

enter image description here

http://regexper.com/....

答案 1 :(得分:19)

您不需要date验证程序。它doesn't support dd/mm/yyyy format,这就是为什么你要输入“请输入有效日期”的消息,如13/01/2014的输入。您已经拥有dateITA验证程序,可根据需要使用dd / mm / yyyy格式。

就像date验证程序一样,dateGreaterThandateLessThan的代码调用new Date作为输入字符串,并且解析日期时遇到同样的问题。您可以使用这样的函数来解析日期:

function parseDMY(value) {
    var date = value.split("/");
    var d = parseInt(date[0], 10),
        m = parseInt(date[1], 10),
        y = parseInt(date[2], 10);
    return new Date(y, m - 1, d);
}

答案 2 :(得分:15)

如果您使用时刻js库,可以像这样轻松完成 -

jQuery.validator.addMethod("validDate", function(value, element) {
        return this.optional(element) || moment(value,"DD/MM/YYYY").isValid();
    }, "Please enter a valid date in the format DD/MM/YYYY");

答案 3 :(得分:9)

我在项目中遇到了类似的问题。经过艰苦的努力,我找到了这个解决方案:

if ($.datepicker.parseDate("dd/mm/yy","17/06/2015") > $.datepicker.parseDate("dd/mm/yy","20/06/2015"))
    // do something

对于此问题,您不需要像jQuery Validate或Moment.js这样的插件。希望这个解决方案有所帮助。

答案 4 :(得分:3)

这对我来说很好。

$(document).ready(function () {
       $('#btn_move').click( function(){
           var dateformat = /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/;
           var Val_date=$('#txt_date').val();
               if(Val_date.match(dateformat)){
              var seperator1 = Val_date.split('/');
              var seperator2 = Val_date.split('-');

              if (seperator1.length>1)
              {
                  var splitdate = Val_date.split('/');
              }
              else if (seperator2.length>1)
              {
                  var splitdate = Val_date.split('-');
              }
              var dd = parseInt(splitdate[0]);
              var mm  = parseInt(splitdate[1]);
              var yy = parseInt(splitdate[2]);
              var ListofDays = [31,28,31,30,31,30,31,31,30,31,30,31];
              if (mm==1 || mm>2)
              {
                  if (dd>ListofDays[mm-1])
                  {
                      alert('Invalid date format!');
                      return false;
                  }
              }
              if (mm==2)
              {
                  var lyear = false;
                  if ( (!(yy % 4) && yy % 100) || !(yy % 400))
                  {
                      lyear = true;
                  }
                  if ((lyear==false) && (dd>=29))
                  {
                      alert('Invalid date format!');
                      return false;
                  }
                  if ((lyear==true) && (dd>29))
                  {
                      alert('Invalid date format!');
                      return false;
                  }
              }
          }
          else
          {
              alert("Invalid date format!");

              return false;
          }
       });
   });

答案 5 :(得分:3)

这会验证dd / mm / yyyy日期。 编辑你的jquery.validate.js并添加它们。

参考(正则表达式):Regex to validate date format dd/mm/yyyy

dateBR: function( value, element ) {
            return this.optional(element) || /^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/.test(value);
        }

messages: {
dateBR: "Invalid date."
}

classRuleSettings: {
dateBR: {dateBR: true}
}

用法:

 $( "#myForm" ).validate({
            rules: {
                field: {
                    dateBR: true
                }
            }
        });