使用 jQuery 验证插件自定义日期格式

Posted

技术标签:

【中文标题】使用 jQuery 验证插件自定义日期格式【英文标题】:Custom date format with jQuery validation plugin 【发布时间】:2010-10-05 09:59:07 【问题描述】:

如何为 jQuery 指定要使用 Validation Plugin 验证的自定义日期格式?

【问题讨论】:

【参考方案1】:

您可以使用addMethod 函数创建自己的自定义验证方法。假设您想验证“dd/mm/yyyy”:

$.validator.addMethod(
    "australianDate",
    function(value, element) 
        // put your own logic here, this is just a (crappy) example
        return value.match(/^\d\d?\/\d\d?\/\d\d\d\d$/);
    ,
    "Please enter a date in the format dd/mm/yyyy."
);

然后在你的表单上添加:

$('#myForm')
    .validate(
        rules : 
            myDate : 
                australianDate : true
            
        
    )
;

【讨论】:

@blasteralfred: // put your own logic here, this is just a (crappy) example 你能建议我一个语法来验证我所需的格式 DD-MM-YYYY 吗?我是 jquery 的初学者 .. :) 需要注意的是要把myDate改成日期输入字段的名字。 您可以将示例 reg-ex 替换为;返回值.match(/^(((((0[1-9])|(1\d)|(2[0-8])))\/((0[1-9])|(1[ 0-2])))|((31\/((0[13578])|(1[02])))|((29|30)\/((0[1,3-9])| (1[0-2])))))\/((20[0-9][0-9])|(19[0-9][0-9])))|((29\/ 02\/(19|20)(([02468][048])|([13579][26])))))$/);这支持闰年检查。例如。 29/02/20014 将失败验证 29/02/2016 将通过验证。【参考方案2】:

nickf 的回答很好,但请注意,验证插件已经在 additional-methods.js 文件中包含了其他几种日期格式的验证器。在您自己编写之前,请确保尚未有人这样做。

【讨论】:

设置规则 dateISO: true,以 yyy-mm-dd 格式验证日期 太好了,谢谢!例如,“dd/mm/yyyy”格式有“dateITA”。【参考方案3】:

我个人使用非常好的http://www.datejs.com/库。

Docco 在这里:http://code.google.com/p/datejs/wiki/APIDocumentation

您可以使用以下方法获取您的澳大利亚格式,并在 29/02/2012 而不是 29/02/2011 验证闰日:

jQuery.validator.addMethod("australianDate", function(value, element)  
    return Date.parseExact(value, "d/M/yyyy");
);

$("#myForm").validate(
   rules : 
      birth_date :  australianDate : true 
   
);

我也使用屏蔽输入插件来标准化数据http://digitalbush.com/projects/masked-input-plugin/

$("#birth_date").mask("99/99/9999");

【讨论】:

【参考方案4】:

下面是一个新的验证方法示例,它可以验证几乎任何日期格式,包括:

dd/mm/yy 或 dd/mm/yyyy dd.mm.yy 或 dd.mm.yyyy dd,mm,yy 或 dd,mm,yyyy dd mm yy 或 dd mm yyyy dd-mm-yy 或 dd-mm-yyyy

然后,当您将值传递给 php 时,您可以使用 strtotime 进行转换

添加方法如下:

    $.validator.addMethod("anyDate",
    function(value, element) 
        return value.match(/^(0?[1-9]|[12][0-9]|3[0-1])[/., -](0?[1-9]|1[0-2])[/., -](19|20)?\d2$/);
    ,
    "Please enter a date in the format!"
);

然后你添加新的过滤器:

$('#myForm')
.validate(
    rules : 
        field: 
            anyDate: true
        
    
)

;

【讨论】:

为了包含mmm,我将正则表达式稍微修改为/^(0?[1-9]|[12][0-9]|3[0-1])[/., -](0?[1-9]|1[0-2]|[a-zA-Z]3)[/., -](19|20)?\d2$/【参考方案5】:

这是一个最近对我有用的特定代码示例:

// Replace the builtin US date validation with UK date validation
$.validator.addMethod(
    "date",
    function ( value, element ) 
        var bits = value.match( /([0-9]+)/gi ), str;
        if ( ! bits )
            return this.optional(element) || false;
        str = bits[ 1 ] + '/' + bits[ 0 ] + '/' + bits[ 2 ];
        return this.optional(element) || !/Invalid|NaN/.test(new Date( str ));
    ,
    "Please enter a date in the format dd/mm/yyyy"
);

我应该注意到这实际上取代了内置的日期验证例程,尽管我看不出这会导致当前插件出现问题。

然后我将其应用于表单:

$( '#my_form input.date' ).rules( 'add',  date: true  );

【讨论】:

【参考方案6】:

这是我结合/修改以前的帖子以达到我想要的结果:

        // Override built-in date validator
        $.validator.addMethod(
            "date",
            function (value, element) 
                //Return            NB: isRequired is not checked at this stage
                return (value=="")? true : isDate(value);
            ,
            "* invalid"
        );

在您的验证配置之后添加日期验证。 IE。在调用 $(form).validate( ... ) 方法之后。

        //Add date validation (if applicable)
        $('.date', $(frmPanelBtnId)).each(function () 
            $(this).rules('add', 
                date: true
            );
        );

最后,主要的isDate javascript函数修改为UK Date Format

//Validates a date input -- http://jquerybyexample.blogspot.com/2011/12/validate-date-    using-jquery.html
function isDate(txtDate) 
    var currVal = txtDate;
    if (currVal == '')
       return false;

  //Declare Regex  
  var rxDatePattern = /^(\d1,2)(\/|-)(\d1,2)(\/|-)(\d4)$/;
  var dtArray = currVal.match(rxDatePattern); // is format OK?

  if (dtArray == null)
      return false;

   //Checks for dd/mm/yyyy format.
   var dtDay = dtArray[1];
   var dtMonth = dtArray[3];
   var 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;

【讨论】:

【参考方案7】:

乔恩,你有一些语法错误,见下文,这对我有用。

  <script type="text/javascript">
$(document).ready(function () 

  $.validator.addMethod(
      "australianDate",
      function (value, element) 
        // put your own logic here, this is just a (crappy) example 
        return value.match(/^\d\d?\/\d\d?\/\d\d\d\d$/);
      ,
      "Please enter a date in the format dd/mm/yyyy"
    );

  $('#testForm').validate(
    rules: 
      "myDate": 
        australianDate: true
      
    
  );

);             

【讨论】:

【参考方案8】:
$.validator.addMethod("mydate", function (value, element) 

        return this.optional(element) || /^(\d4)(-|\/)(([0-1]1)([1-2]1)|([0]1)([0-9]1))(-|\/)(([0-2]1)([1-9]1)|([3]1)([0-1]1))/.test(value);

    );

你可以输入yyyy-mm-dd也可以yyyy/mm/dd

但无法判断月份的大小,即 2 月 28 日或 29 天。

【讨论】:

【参考方案9】:

@blasteralfred:

我得到以下规则为我验证正确的日期 (DD MM YYYY)

jQuery.validator.addMethod(
"validDate",
function(value, element) 
    return value.match(/(?:0[1-9]|[12][0-9]|3[01]) (?:0[1-9]|1[0-2]) (?:19|20\d2)/);
,
"Please enter a valid date in the format DD MM YYYY"

);

对于 DD/MM/YYYY

jQuery.validator.addMethod(
"validDate",
function(value, element) 
    return value.match(/(?:0[1-9]|[12][0-9]|3[01])\/(?:0[1-9]|1[0-2])\/(?:19|20\d2)/);
,
"Please enter a valid date in the format DD/MM/YYYY"

);

这不会验证 2017 年 1 月 13 日和 2017 年 1 月 13 日。

而且也不验证 50 12 2017 和 50/12/2017。

【讨论】:

【参考方案10】:

很简单,示例:适用于 HTML5 自动 type="date"

<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.14.0/jquery.validate.min.js"></script>
<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.14.0/additional-methods.min.js"></script>
<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.14.0/localization/messages_es.js"></script>

$(function () 

        // Overload method default "date" jquery.validate.min.js
        $.validator.addMethod(
            "date",
            function(value, element) 
                var dateReg = /^\d2([./-])\d2\1\d4$/;
                return value.match(dateReg);
            ,
            "Invalid date"
        );

     // Form Demo jquery.validate.min.js
     $('#form-datos').validate(
        submitHandler: function(form) 
            form.submit();
        
    );

);

【讨论】:

以上是关于使用 jQuery 验证插件自定义日期格式的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 验证插件日期格式:日期干扰 dateITA

jQuery DateTimePicker 日期和时间插件

自定义格式日期的 MVC3 不显眼日期验证

带有 jquery datepicker 错误的 jquery 验证插件(请输入有效日期)

jQuery插件

jQuery12种双日期插件