115

如何在 jQuery 中检查/验证结束日期 [文本框] 是否大于开始日期 [文本框]?

4

16 回答 16

188

只是扩大融合的答案。此扩展方法使用 jQuery 验证插件工作。它将验证日期和数字

jQuery.validator.addMethod("greaterThan", 
function(value, element, params) {

    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}.');

要使用它:

$("#EndDate").rules('add', { greaterThan: "#StartDate" });

或者

$("form").validate({
    rules: {
        EndDate: { greaterThan: "#StartDate" }
    }
});
于 2010-02-11T00:55:12.500 回答
88
var startDate = new Date($('#startDate').val());
var endDate = new Date($('#endDate').val());

if (startDate < endDate){
// Do something
}

我认为应该这样做

于 2009-05-07T10:58:21.587 回答
21

派对有点晚了,但这是我的一部分

Date.parse(fromDate) > Date.parse(toDate)

这是详细信息:

var from = $("#from").val();
var to = $("#to").val();

if(Date.parse(from) > Date.parse(to)){
   alert("Invalid Date Range");
}
else{
   alert("Valid date Range");
}
于 2013-08-05T07:49:06.373 回答
15

参考 jquery.validate.js 和 jquery-1.2.6.js。将 startDate 类添加到您的开始日期文本框中。将 endDate 类添加到您的结束日期文本框中。

将此脚本块添加到您的页面:-

<script type="text/javascript">
    $(document).ready(function() {
        $.validator.addMethod("endDate", function(value, element) {
            var startDate = $('.startDate').val();
            return Date.parse(startDate) <= Date.parse(value) || value == "";
        }, "* End date must be after start date");
        $('#formId').validate();
    });
</script>

希望这可以帮助 :-)

于 2009-05-11T15:05:31.060 回答
13

我只是在修改danteuno 的回答,发现虽然是善意的,但遗憾的是它在几个不是IE 的浏览器上被破坏了。这是因为 IE 将非常严格地接受它作为Date构造函数的参数,但其他人不会。例如,Chrome 18 提供

> new Date("66")
  Sat Jan 01 1966 00:00:00 GMT+0200 (GTB Standard Time)

这会导致代码采用“比较日期”路径,并且从那里开始走下坡路(例如new Date("11")大于new Date("66"),这显然与预期效果相反)。

因此,经过考虑,我修改了代码以优先于“日期”路径的“数字”路径,并使用Validate decimal numbers in JavaScript - IsNumeric() 中提供的出色方法验证输入确实是数字。

最后,代码变为:

$.validator.addMethod(
    "greaterThan",
    function(value, element, params) {
        var target = $(params).val();
        var isValueNumeric = !isNaN(parseFloat(value)) && isFinite(value);
        var isTargetNumeric = !isNaN(parseFloat(target)) && isFinite(target);
        if (isValueNumeric && isTargetNumeric) {
            return Number(value) > Number(target);
        }

        if (!/Invalid|NaN/.test(new Date(value))) {
            return new Date(value) > new Date(target);
        }

        return false;
    },
    'Must be greater than {0}.');
于 2012-04-24T13:32:19.957 回答
6

所以我需要这条规则是可选的,以上建议都不是可选的。如果我调用该方法,即使我将其设置为需要一个值,它也会按要求显示。

这是我的电话:

  $("#my_form").validate({
    rules: {
      "end_date": {
        required: function(element) {return ($("#end_date").val()!="");},
        greaterStart: "#start_date"
      }
    }
  });//validate()

addMethod的不如 Mike E. 的最受好评的答案强大,但我使用 JqueryUI 日期选择器来强制选择日期。如果有人能告诉我如何确保日期是数字并且方法是可选的,那就太好了,但现在这个方法对我有用:

jQuery.validator.addMethod("greaterStart", function (value, element, params) {
    return this.optional(element) || new Date(value) >= new Date($(params).val());
},'Must be greater than start date.');
于 2013-05-27T01:35:09.423 回答
5

文本字段中的日期值可以通过 jquery 的 .val() 方法获取,例如

var datestr1 = $('#datefield1-id').val();
var datestr2 = $('#datefield2-id').val();

我强烈建议在比较它们之前解析日期字符串。Javascript 的 Date 对象有一个 parse()-Method,但它只支持美国日期格式 (YYYY/MM/DD)。它返回自 unix 纪元开始以来的毫秒数,因此您可以简单地将值与 > 或 < 进行比较。

如果您想要不同的格式(例如 ISO 8661),您需要使用正则表达式或免费的 date.js 库。

如果你想成为超级用户,你可以使用 jquery ui datepickers 而不是 textfields。有一个允许输入日期范围的日期选择器变体:

http://www.filamentgroup.com/lab/date_range_picker_using_jquery_ui_16_and_jquery_ui_css_framework/

于 2009-05-07T15:39:00.303 回答
4

在 javascript/jquery 中,大多数开发人员使用字符串的 From & To 日期比较,而不转换为日期格式。从日期开始比较的最简单方法是比迄今为止更大。

Date.parse(fromDate) > Date.parse(toDate)

在比较之前始终解析从和到日期以获得准确的结果

于 2017-11-22T07:57:25.420 回答
3
jQuery('#from_date').on('change', function(){
    var date = $(this).val();
    jQuery('#to_date').datetimepicker({minDate: date});  
});
于 2016-05-09T13:35:49.273 回答
2

我喜欢弗兰兹所说的,因为这就是我正在使用的:P

var date_ini = new Date($('#id_date_ini').val()).getTime();
var date_end = new Date($('#id_date_end').val()).getTime();
if (isNaN(date_ini)) {
// error date_ini;
}
if (isNaN(date_end)) {
// error date_end;
}
if (date_ini > date_end) {
// do something;
}
于 2011-02-05T08:50:40.753 回答
2
$(document).ready(function(){
   $("#txtFromDate").datepicker({
        minDate: 0,
        maxDate: "+60D",
        numberOfMonths: 2,
        onSelect: function(selected) {
          $("#txtToDate").datepicker("option","minDate", selected)
        }
    });

    $("#txtToDate").datepicker({
        minDate: 0,
        maxDate:"+60D",
        numberOfMonths: 2,
        onSelect: function(selected) {
           $("#txtFromDate").datepicker("option","maxDate", selected)
        }
    });
});

或访问此链接

于 2016-01-20T11:56:42.980 回答
1
function endDate(){
    $.validator.addMethod("endDate", function(value, element) {
      var params = '.startDate';
        if($(element).parent().parent().find(params).val()!=''){
           if (!/Invalid|NaN/.test(new Date(value))) {
               return new Date(value) > new Date($(element).parent().parent().find(params).val());
            }
       return isNaN(value) && isNaN($(element).parent().parent().find(params).val()) || (parseFloat(value) > parseFloat($(element).parent().parent().find(params).val())) || value == "";              
      }else{
        return true;
      }
      },jQuery.format('must be greater than start date'));

}

function startDate(){
            $.validator.addMethod("startDate", function(value, element) {
            var params = '.endDate';
            if($(element).parent().parent().parent().find(params).val()!=''){
                 if (!/Invalid|NaN/.test(new Date(value))) {
                  return new Date(value) < new Date($(element).parent().parent().parent().find(params).val());
            }
           return isNaN(value) && isNaN($(element).parent().parent().find(params).val()) || (parseFloat(value) < parseFloat($(element).parent().parent().find(params).val())) || value == "";
                 }
                        else{
                     return true;
}

    }, jQuery.format('must be less than end date'));
}

希望这会有所帮助:)

于 2012-11-01T07:23:56.833 回答
0

首先,您使用 split 函数拆分两个输入框的值。然后以相反的顺序连接相同的内容。连接国家后将其解析为整数。然后比较 if 语句中的两个值。例如1>20-11-2018 2>21-11-2018

在拆分和连接新值后比较 20181120 和 20181121 之后比较相同。

var date1 = $('#datevalue1').val();
var date2 = $('#datevalue2').val();
var d1 = date1.split("-");
var d2 = date2.split("-");

d1 = d1[2].concat(d1[1], d1[0]);
d2 = d2[2].concat(d2[1], d2[0]);

if (parseInt(d1) > parseInt(d2)) {

    $('#fromdatepicker').val('');
} else {

}
于 2018-07-29T10:56:58.937 回答
0

这应该工作

$.validator.addMethod("endDate", function(value, element) {
            var startDate = $('#date_open').val();
            return Date.parse(startDate) <= Date.parse(value) || value == "";
        }, "* End date must be after start date");

于 2018-10-27T17:13:38.177 回答
0

你可以在两个不同的日期做这样的警报。

$('#end_date').on('change', function(){
             var startDate = $('#start_date').val();
             var endDate = $('#end_date').val();
             if (endDate < startDate){
                 alert('End date should be greater than Start date.');
                $('#end_date').val('');
             }
         });

您可以在日历上执行,它会自动禁用以前的日期。

$("#start_date").datepicker({
            dateFormat: 'dd/mm/yy',
            onSelect: function(date) {
                $("#end_date").datepicker('option', 'minDate', date);
            }
        });
$("#end_date").datepicker({ dateFormat: 'dd/mm/yy' });
于 2021-05-24T13:34:42.857 回答
-2

如果保证格式正确 YYYY/MM/DD 并且两个字段之间完全相同,那么您可以使用:

if (startdate > enddate) {
   alert('error'
}

作为字符串比较

于 2009-05-07T10:56:02.357 回答