Ü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" }
    }
});
Mike E.
quelle
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

Shane O'Grady
quelle
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");
}
Kamran Ahmed
quelle
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 :-)

Russell Giddings
quelle
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}.');
Jon
quelle
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/

Franz
quelle
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.');
Nächstenliebe
quelle
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

Kunal Brahme
quelle
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;
}
StefanNch
quelle
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

schlaff
quelle
2
jQuery('#from_date').on('change', function(){
    var date = $(this).val();
    jQuery('#to_date').datetimepicker({minDate: date});  
});
Atchyut Nagabhairava
quelle
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 :)

Santosh Kori
quelle
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 {

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

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

Nadia Alramli
quelle
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