jQuery日期验证-格式和范围

jQuery日期验证-格式和范围,jquery,validation,date,jquery-validate,Jquery,Validation,Date,Jquery Validate,我需要有两个日期字段(至,自),并且需要验证它们: 是否为mm/dd/yyyy格式 两个日期都在特定范围内 顾名思义,to应始终大于from 只要我输入其中任何一个字段,这两个字段都将成为必填字段 使用jquery验证api实现相同功能的最佳方法是什么 注意:我确实在一些链接上读到了关于格式验证的内容,例如,但这些链接不能确保这是一个有效日期,我可能会输入类似于02/31/2999 我试过了 jQuery.validator.addMethod("DateFormat", function(

我需要有两个日期字段(
),并且需要验证它们:

  • 是否为mm/dd/yyyy格式
  • 两个日期都在特定范围内
  • 顾名思义,
    to
    应始终大于
    from
  • 只要我输入其中任何一个字段,这两个字段都将成为必填字段
使用jquery验证api实现相同功能的最佳方法是什么

注意:我确实在一些链接上读到了关于格式验证的内容,例如,但这些链接不能确保这是一个有效日期,我可能会输入类似于
02/31/2999

我试过了

jQuery.validator.addMethod("DateFormat", function(value, element) {
    var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/ ;
    var values = value.split("/");
    return this.optional(element) || (value.test(date_regex) && (new Date(values[2], values[0], values[1])));
});

我们几乎完全解决了这个问题。您需要做的是创建一系列验证规则。 首先,给日期一些适当的类属性——“fromDate”和“toDate”,比如说

  • 一种使用正则表达式来确保其格式正确的方法
  • 使用javascript日期对象转换日期,并确保它们在正确的范围内
  • 一个用于from date,它知道如何查找to date(通常通过提升一两级,然后在其上运行
    .find('input.toDate'))
    或类似命令来处理),并对它们进行比较
  • 到目前为止,另一个是反向的
  • 如果两者都为空,则返回true;如果其中一个为空,而另一个为满,则返回false
然后使用
jQuery.validate.addClassRules()
将适当的规则分配给适当的类


在您在讨论中的表单上设置验证器之前,将所有这些代码放在一起,它应该可以正常工作。语法留给读者作为练习。

添加了以下验证方法

// jquery validation method to validate date format
jQuery.validator.addMethod("DateFormat", function(value, element) {
    var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/ ;
    var comp = value.split('/');
    var m = parseInt(comp[0], 10);
    var d = parseInt(comp[1], 10);
    var y = parseInt(comp[2], 10);
    var date = new Date(y,m,d);
    return this.optional(element) || (date_regex.test(value) && date.getFullYear() == y && date.getMonth() == m && date.getDate() == d);
});
//jquery validation method to validate date range
jQuery.validator.addMethod("DateToFrom", function(value, element, arg0, arg1) {
    var comp = value.split('/');
    var m = parseInt(comp[0], 10);
    var d = parseInt(comp[1], 10);
    var y = parseInt(comp[2], 10);
    var currentEltdate = new Date(y,m,d);

    comp = $("#"+arg0).val().split('/');
    m = parseInt(comp[0], 10);
    d = parseInt(comp[1], 10);
    y = parseInt(comp[2], 10);
    var otherEltDate = new Date(y,m,d);

    var lowerDate, upperDate;
    if(arg1 == true){//current element should be lower date
        lowerDate = currentEltdate;
        upperDate = otherEltDate;
    }else{
        lowerDate = otherEltDate;
        upperDate = currentEltdate;
    }
    return this.optional(element) || (lowerDate <= upperDate);
});
// jquery validation method to validate date range
jQuery.validator.addMethod("DateRange", function(value, element, arg0, arg1) {
    var comp = arg0.split('/');
    var m = parseInt(comp[0], 10);
    var d = parseInt(comp[1], 10);
    var y = parseInt(comp[2], 10);
    var startDate = new Date(y,m,d);

    comp = arg1.split('/');
    m = parseInt(comp[0], 10);
    d = parseInt(comp[1], 10);
    y = parseInt(comp[2], 10);
    var endDate = new Date(y,m,d);

    comp = value.split('/');
    m = parseInt(comp[0], 10);
    d = parseInt(comp[1], 10);
    y = parseInt(comp[2], 10);
    var date = new Date(y,m,d);

    return this.optional(element) || ((startDate <= date) && (date <= endDate));
});
//用于验证日期格式的jquery验证方法
addMethod(“DateFormat”,函数(值,元素){
var date_regex=/(0[1-9]| 1[0-2])\/(0[1-9]| 1\d | 2\d | 3[01])\/(19 | 20)\d{2}$/;
var comp=价值分割('/');
var m=parseInt(comp[0],10);
var d=parseInt(comp[1],10);
变量y=parseInt(comp[2],10);
var日期=新日期(y、m、d);
返回此.optional(element)| |(date_regex.test(value)&&date.getFullYear()=y&&date.getMonth()=m&&date.getDate()=d);
});
//用于验证日期范围的jquery验证方法
addMethod(“DateToFrom”,函数(值,元素,arg0,arg1){
var comp=价值分割('/');
var m=parseInt(comp[0],10);
var d=parseInt(comp[1],10);
变量y=parseInt(comp[2],10);
var currentEltdate=新日期(y、m、d);
comp=$(“#”+arg0.val().split('/');
m=parseInt(comp[0],10);
d=parseInt(comp[1],10);
y=parseInt(comp[2],10);
var otherEltDate=新日期(y、m、d);
var lowerDate,upperDate;
如果(arg1==true){//当前元素应为较低的日期
lowerDate=当前日期;
upperDate=其他日期;
}否则{
lowerDate=其他日期;
upperDate=当前日期;
}

返回此。可选(元素)| |(lowerDate我尝试了一些解决方案,请检查更新的问题。仍然无法找到完整的证明方法来检查mm/dd/yyyy方法中的有效日期。如果您在2月31日的问题上遇到问题,请使用javascript date()提供任何帮助对象仍然有帮助。一旦您使用regexp(如上所述)完成了粗略检查,您就可以将其放入日期构造函数中。然后您可以询问一个月的日期(记住,日期对象中的日期和月份是以0为基础的-这会使它更复杂,但仍然可行),并将其与日期上打印的月份进行比较。如果您得到“2月31日”或者类似的,日期构造函数会导致它滚动到下一个月,并且月份不会正确排列。如果您有其他问题,请清楚地解释mroe。