jQueryを使用して、終了日が開始日より後であることを検証する


回答:


177

核融合の答えを拡大するだけです。この拡張メソッドは、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" }
    }
});

これを2つのテキストボックスでどのように使用しますか?
Cros

1
アプリで空白の終了日を考慮に入れるために少し変更する必要がありましたが、これは大部分を行いました。codeif(value == 0){trueを返す; } else if(!/ Invalid | NaN / ...code
Frank Luke

3
バグ警告:私は質問が日付に関するものであることを理解していますが、このコードは宣伝されている数値では機能しません。修正が含まれる理由と方法を説明する回答を追加しまし
Jon

1
@Cros jQuery.validator.addMethod( "zip_code_checking"、function(value、element){return jQuery( '#zip_endvalue')。val()> jQuery( '#zip_startvalue')。val()}、 "*郵便番号終了値は郵便番号の開始値より大きくなければなりません ");
Balasuresh Asaithambi

これにより、Google Chromeでエラーが発生します。12未満または31より大きい値を渡した場合、最終的には日付として解析されるため、日付としても検証されます。これを2つの方法(急いで)に分ける必要がありましたが、より適切な解決策を見つけたいと思います!
sbsatter 2017年

84
var startDate = new Date($('#startDate').val());
var endDate = new Date($('#endDate').val());

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

それでいいと思う


正しい?ありがとう!プラグインは必要ありません。:P
Vael Victus 2012

1
jQuery.validateはすばらしいですが、実装が簡単です
mknopf 2014

どうもありがとうございます。とても簡単です。
Nimit Joshi 2015

唯一の問題は、youuが2年に及ぶ日付範囲を持っている場合です。2015
6

このような日付範囲は2年以内に広がります。2015年6月27日から2016年2月2日まで、適切に検証されています。
タマライT

19

パーティーには少し遅れますが、ここが私の役割です

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");
}

14

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>

お役に立てれば :-)


私はこのテクニックが好きです
ワッフル2017

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")、これは明らかに望ましい効果の反対です)。

したがって、検討後、「日付」パスよりも「数値」パスを優先するようにコードを変更し、JavaScriptでの10進数の検証-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}.');

これはieで機能しますが、オペラやFFで機能させることはできません。
2012

:選択した終了日が選択した開始日より後であっても、検証エラーが発生します
コード化

5

テキストフィールドの日付値は、jqueryの.val()メソッドで次のようにフェッチできます。

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

比較する前に日付文字列を解析することを強くお勧めします。JavascriptのDateオブジェクトにはparse()メソッドがありますが、サポートされているのは米国の日付形式(YYYY / MM / DD)のみです。UNIXエポックの開始からのミリ秒を返すため、値を>または<と比較するだけで済みます。

異なる形式(ISO 8661など)が必要な場合は、正規表現または無料のdate.jsライブラリを使用する必要があります。

スーパーユーザーになりたい場合は、テキストフィールドの代わりにjquery ui datepickersを使用できます。日付範囲を入力できる日付ピッカーバリアントがあります。

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


5

だから私はこのルールをオプションにする必要があり、上記の提案はオプションではありません。メソッドを呼び出すと、値が必要に設定されていても、必要に応じて表示されます。

これは私の電話です:

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

addMethodはMike E.の最高評価の回答ほど堅牢ではありませんが、JqueryUI datepickerを使用して日付を強制的に選択しています。日付が数字であることを確認する方法を誰かに教えられ、メソッドをオプションにすることができればそれは素晴らしいことですが、今のところこの方法は私にとってはうまくいきます:

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

4

javascript / jqueryでは、ほとんどの開発者は日付形式に変換せずに、文字列であるFrom&To日付比較を使用します。日付から比較する最も簡単な方法は、日付よりも優れています。

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

正確な結果を得るために、比較する前に常に日付から日付まで解析します


これは質問に対する答えを提供しません。十分な評判られると、どの投稿にもコメントできるようになります。代わりに、質問者からの説明を必要としない回答を提供してください。- レビューから
マムン

それが問題の解決策です。私は試して答えました。
Kunal Brahme 2017年

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;
}

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

またはこのリンクにアクセスしてください



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

これが役立つことを願っています:)


0

最初に、split関数を使用して2つの入力ボックスの値を分割します。次に、同じものを逆の順序で連結します。連結後、整数に解析します。次に、ifステートメントの2つの値を比較します。例: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 {

}

このソリューションの説明を追加してください
JanČerný2018

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");


-2

形式が正しいYYYY / MM / DDであり、2つのフィールド間でまったく同じであることが保証されている場合は、次を使用できます。

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

文字列比較として


jqueryで開始日と終了日を定義するにはどうすればよいですか?
入力

私はそれらが通常の文字列であることを想定しています。あなたはそれらを$(#startdate:input).val()と$(#enddate:input).val()のように読みます
Nadia Alramli
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.