Überprüfen Sie mit jQuery, ob das Enddatum größer als das Startdatum ist


Antworten:


176

Nur Fusionen erweitern Antwort. Diese Erweiterungsmethode funktioniert mit dem jQuery-Validierungs-Plugin. Es werden Daten und Zahlen validiert

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

Um es zu benutzen:

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

oder

$("form").validate({
    rules: {
        EndDate: { greaterThan: "#StartDate" }
    }
});

Wie benutzt man das mit zwei Textfeldern?
Cros

1
Ich musste es leicht ändern, um leere Enddaten in meiner App zuzulassen, aber das machte den Großteil aus. codeif (value == 0) {return true; } else if (! / Invalid | NaN / ...code
Frank Luke

3
BUG-Warnung: Mir ist klar, dass es sich bei der Frage um Daten handelt, aber dieser Code funktioniert nicht für Zahlen wie angegeben. Ich habe eine Antwort hinzugefügt , die das Warum und Wie erklärt, was auch den Fix beinhaltet.
Jon

1
@Cros jQuery.validator.addMethod ("zip_code_checking", Funktion (Wert, Element) {return jQuery ('# zip_endvalue'). Val ()> jQuery ('# zip_startvalue'). Val ()}, "* Postleitzahlende Wert sollte größer sein als Postleitzahl Startwert ");
Balasuresh Asaithambi

Dies führt zu einem Fehler in Google Chrome. Wenn Sie einen Wert kleiner als 12 oder größer als 31 übergeben, wird dieser als Datum analysiert und daher auch als Datum validiert. Ich musste dies in zwei Methoden aufteilen (in Eile), aber ich würde gerne eine geeignetere Lösung finden!
sbsatter

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

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

Das sollte es tun, denke ich


Richtig? Vielen Dank! Kein Plugin erforderlich. : P
Vael Victus

1
schön und einfach zu implementieren, obwohl jQuery.validate fantastisch ist
mknopf

Vielen Dank .. so einfach.
Nimit Joshi

Das einzige Problem ist, wenn Sie einen Zeitraum von zwei Jahren haben, z. 27-06-2015 bis 02-02-2016 .... es wird nicht richtig validiert
Himansz

Ein solcher Datumsbereich erstreckt sich innerhalb von zwei Jahren, z. 27-06-2015 bis 02-02-2016, ist für mich richtig validiert.
Thamarai T

19

Etwas spät zur Party, aber hier ist mein Teil

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

Hier ist das Detail:

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

Referenz jquery.validate.js und jquery-1.2.6.js. Fügen Sie Ihrem Startdatum-Textfeld eine startDate-Klasse hinzu. Fügen Sie Ihrem Enddatum-Textfeld eine endDate-Klasse hinzu.

Fügen Sie diesen Skriptblock Ihrer Seite hinzu: -

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

Hoffe das hilft :-)


Ich mag diese Technik
Wahmal

13

Ich habe nur an Danteunos Antwort herumgebastelt und festgestellt, dass sie zwar gut gemeint ist, aber leider in mehreren Browsern, die kein IE sind, kaputt ist . Dies liegt daran, dass der IE ziemlich streng ist, was er als Argument für den DateKonstruktor akzeptiert , andere jedoch nicht. Zum Beispiel gibt Chrome 18

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

Dies führt dazu, dass der Code den Pfad "Datumsvergleiche" verwendet und von dort aus alles bergab geht (z. B. new Date("11")größer als new Date("66")und dies ist offensichtlich das Gegenteil des gewünschten Effekts).

Daher habe ich nach Prüfung den Code geändert, um dem Pfad "Zahlen" Vorrang vor dem Pfad "Datumsangaben" zu geben und zu überprüfen, ob die Eingabe tatsächlich numerisch ist, und zwar mit der hervorragenden Methode, die in Validieren von Dezimalzahlen in JavaScript - IsNumeric () bereitgestellt wird .

Am Ende wird der Code:

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

das funktioniert in dh aber kann es nicht dazu bringen, in Oper und FF zu funktionieren, irgendwelche Ideen?
Codiert

: Es kommt mit dem Validierungsfehler, auch wenn das ausgewählte Enddatum nach dem ausgewählten Startdatum liegt
Codded

5

Die Datumswerte aus den Textfeldern können mit der .val () -Methode von jquery wie abgerufen werden

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

Ich würde dringend empfehlen, die Datumszeichenfolgen vor dem Vergleich zu analysieren. Das Date-Objekt von Javascript verfügt über eine parse () - Methode, unterstützt jedoch nur US-Datumsformate (JJJJ / MM / TT). Es gibt die Millisekunden seit Beginn der Unix-Epoche zurück, sodass Sie Ihre Werte einfach mit> oder <vergleichen können.

Wenn Sie verschiedene Formate wünschen (z. B. ISO 8661), müssen Sie auf reguläre Ausdrücke oder die kostenlose Bibliothek date.js zurückgreifen.

Wenn Sie sehr benutzerfreundlich sein möchten, können Sie anstelle von Textfeldern jquery ui datepickers verwenden. Es gibt eine Datumsauswahlvariante, mit der Datumsbereiche eingegeben werden können:

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


5

Daher musste diese Regel optional sein, und keiner der oben genannten Vorschläge ist optional. Wenn ich die Methode aufrufe, wird sie nach Bedarf angezeigt, auch wenn ich einen Wert benötige.

Das ist mein Anruf:

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

Meine addMethodAntwort ist nicht so robust wie die von Mike E. am besten bewertete, aber ich verwende den JqueryUI-Datumsauswahlschalter, um eine Datumsauswahl zu erzwingen. Wenn mir jemand sagen kann, wie ich sicherstellen kann, dass die Daten Zahlen sind und die Methode optional ist, wäre das großartig, aber im Moment funktioniert diese Methode für mich:

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

In Javascript / JQuery verwenden die meisten Entwickler den From & To-Datumsvergleich als Zeichenfolge, ohne ihn in das Datumsformat zu konvertieren. Der einfachste Weg, vom Datum zu vergleichen, ist größer als bis heute.

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

Analysieren Sie immer vor und nach dem Vergleich, um genaue Ergebnisse zu erhalten


Dies gibt keine Antwort auf die Frage. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren . Geben Sie stattdessen Antworten, die nicht vom Fragesteller geklärt werden müssen . - Aus dem Rückblick
Mamun

Es ist eine Lösung zu hinterfragen. Ich habe es versucht und geantwortet.
Kunal Brahme

2

Ich mag, was Franz gesagt hat, weil ich es benutze: 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)
        }
    });
});

Oder besuchen Sie diesen Link


2
jQuery('#from_date').on('change', function(){
    var date = $(this).val();
    jQuery('#to_date').datetimepicker({minDate: date});  
});

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

Hoffe das wird helfen :)


0

Zuerst teilen Sie die Werte von zwei Eingabefeldern mithilfe der Aufteilungsfunktion. dann das gleiche in umgekehrter Reihenfolge. nach concat nation parse es auf integer. Vergleichen Sie dann zwei Werte in der if-Anweisung. zB 1> 20-11-2018 2> 21-11-2018

Nach dem Aufteilen und Zusammenstellen neuer Werte für den Vergleich 20181120 und 20181121 werden die gleichen Werte danach verglichen.

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 {

}

Bitte fügen Sie eine Erklärung dieser Lösung hinzu
Jan Černý

0

das sollte funktionieren

$.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

Wenn das Format garantiert korrekt ist JJJJ / MM / TT und genau dasselbe zwischen den beiden Feldern, können Sie Folgendes verwenden:

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

Als Stringvergleich


Wie definiere ich das Start- und Enddatum in jquery?
Eingabe

Ich gehe davon aus, dass es sich um normale Saiten handelt. Sie lesen sie so $ (# Startdatum: Eingabe) .val () und $ (# Enddatum: Eingabe) .val ()
Nadia Alramli
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.