Convalida che la data di fine sia maggiore della data di inizio con jQuery


Risposte:


177

Basta espandere la risposta alle fusioni. questo metodo di estensione funziona utilizzando il plug-in di convalida jQuery. Validerà date e numeri

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

Per usarlo:

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

o

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

Come lo usi con due caselle di testo?
Cros

1
Ho dovuto modificarlo leggermente per consentire date di fine vuote nella mia app, ma questo ha fatto il grosso. codeif (value == 0) {return true; } else if (! / Invalid | NaN / ...code
Frank Luke

3
Avviso BUG: mi rendo conto che la domanda riguarda le date, ma questo codice non funzionerà per i numeri come pubblicizzato. Ho aggiunto una risposta che spiega il perché e il come che include anche la correzione.
Jon

1
@Cros jQuery.validator.addMethod ("zip_code_checking", function (value, element) {return jQuery ('# zip_endvalue'). Val ()> jQuery ('# zip_startvalue'). Val ()}, "* Zip code end il valore deve essere maggiore del valore iniziale del codice postale ");
Balasuresh Asaithambi

Ciò restituisce un errore in Google Chrome. Se passi un valore inferiore a 12 o maggiore di 31, viene analizzato come una data e quindi viene convalidato anche come data. Ho dovuto separarlo in due metodi (in fretta), ma mi piacerebbe trovare una soluzione più adatta!
sbsatter

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

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

Penso che dovrebbe bastare


Destra? Grazie! Nessun plugin necessario. : P
Vael Victus

1
bello e facile da implementare, anche se jQuery.validate è fantastico
mknopf

Grazie mille .. così facile.
Nimit Joshi

l'unico problema è quando hai un intervallo di date che va da due anni ad es. Dal 27-06-2015 al 02-02-2016 ... non verrà convalidato correttamente
Himansz,

Tale intervallo di date che si estende entro due anni, ad es. Dal 27-06-2015 al 02-02-2016, è convalidato correttamente per me.
Thamarai T

19

Un po 'tardi per la festa, ma ecco la mia parte

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

Ecco il dettaglio:

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

Fare riferimento a jquery.validate.js e jquery-1.2.6.js. Aggiungi una classe startDate alla casella di testo della data di inizio. Aggiungi una classe endDate alla casella di testo della data di fine.

Aggiungi questo blocco di script alla tua pagina: -

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

Spero che questo ti aiuti :-)


mi piace questa tecnica
wahmal

13

Stavo solo armeggiando con la risposta di danteuno e ho scoperto che, sebbene di buone intenzioni, purtroppo non funziona su diversi browser che non sono IE. Questo perché IE sarà piuttosto severo su ciò che accetta come argomento per il Datecostruttore, ma altri no. Ad esempio, Chrome 18 dà

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

Questo fa sì che il codice prenda il percorso "confronta date" e tutto va in discesa da lì (ad esempio new Date("11")è maggiore di new Date("66")e questo è ovviamente l'opposto dell'effetto desiderato).

Quindi, dopo aver considerato, ho modificato il codice per dare priorità al percorso "numeri" sul percorso "date" e convalidare che l'input sia effettivamente numerico con l'eccellente metodo fornito in Convalida numeri decimali in JavaScript - IsNumeric () .

Alla fine, il codice diventa:

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

funziona in ie ma non riesco a farlo funzionare in opera e FF, qualche idea?
Codded

: Viene visualizzato un errore di convalida anche se la data di fine selezionata è successiva alla data di inizio selezionata
Codded

5

I valori della data dai campi di testo possono essere recuperati dal metodo .val () di jquery come

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

Consiglio vivamente di analizzare le stringhe di data prima di confrontarle. L'oggetto Date di Javascript ha un metodo parse (), ma supporta solo i formati di data USA (AAAA / MM / GG). Restituisce i millisecondi dall'inizio dell'epoca unix, quindi puoi semplicemente confrontare i tuoi valori con> o <.

Se vuoi formati differenti (es. ISO 8661), devi ricorrere alle espressioni regolari o alla libreria gratuita date.js.

Se vuoi essere super user-fiendly, puoi usare jquery ui datepickers invece di textfields. Esiste una variante del selettore di date che consente di inserire intervalli di date:

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


5

Quindi avevo bisogno che questa regola fosse facoltativa e nessuno dei suggerimenti precedenti è facoltativo. Se chiamo il metodo, viene visualizzato come richiesto anche se lo imposto per richiedere un valore.

Questa è la mia chiamata:

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

La mia addMethodnon è robusta come la risposta più votata di Mike E., ma sto usando il datepicker JqueryUI per forzare una selezione della data. Se qualcuno può dirmi come assicurarmi che le date siano numeri e che il metodo sia opzionale sarebbe fantastico, ma per ora questo metodo funziona per me:

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 la maggior parte degli sviluppatori utilizza il confronto di date da e a che è una stringa, senza convertire in formato data. Il modo più semplice per confrontare dalla data è maggiore rispetto alla data.

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

Analizza sempre la data e la data prima del confronto per ottenere risultati accurati


Questo non fornisce una risposta alla domanda. Una volta che avrai una reputazione sufficiente, potrai commentare qualsiasi post ; fornire invece risposte che non richiedono chiarimenti da parte del richiedente . - Dalla recensione
Mamun

È la soluzione alla domanda. Ho provato e ho risposto.
Kunal Brahme,

2

Mi piace quello che ha detto Franz, perché è quello che sto usando: 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)
        }
    });
});

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

Spero che questo ti aiuti :)


0

Per prima cosa dividi i valori di due caselle di input utilizzando la funzione di divisione. quindi concatela lo stesso in ordine inverso. dopo la concatenazione, analizzalo come intero. quindi confronta due valori nell'istruzione if. es. 1> 20-11-2018 2> 21-11-2018

dopo aver diviso e concatenato nuovi valori per il confronto 20181120 e 20181121, il successivo confronto lo stesso.

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 {

}

Si prega di aggiungere una spiegazione di questa soluzione
Jan Černý

0

questo dovrebbe funzionare

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

Se si garantisce che il formato sia corretto AAAA / MM / GG e esattamente lo stesso tra i due campi, è possibile utilizzare:

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

Come confronto tra stringhe


come definisco la data di inizio e la data di fine in jquery?
ingresso

Presumo che siano stringhe regolari. Li hai letti così $ (# startdate: input) .val () e $ (# enddate: input) .val ()
Nadia Alramli
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.