JQuery ile bitiş tarihinin başlangıç ​​tarihinden büyük olduğunu doğrulayın


Yanıtlar:


177

Sadece füzyonları genişletmek cevap. bu uzantı yöntemi jQuery validate eklentisini kullanarak çalışır. Tarihleri ​​ve sayıları doğrulayacak

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

Kullanmak için:

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

veya

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

Bunu iki metin kutusu ile nasıl kullanıyorsunuz?
Cros

1
Uygulamamda bitiş tarihlerinin boş kalmasına izin vermek için biraz değiştirmem gerekti, ancak bu çok büyük bir iş yaptı. codeeğer (değer == 0) {doğru dönüş; } else if (! / Geçersiz | NaN / ...code
Frank Luke

3
HATA uyarısı: Sorunun tarihlerle ilgili olduğunun farkındayım, ancak bu kod reklamı yapılan rakamlar için çalışmayacak. Düzeltmeyi de içeren neden ve nasıl olduğunu açıklayan bir cevap ekledim .
Jon

1
@Cros jQuery.validator.addMethod ("zip_code_checking", işlev (değer, öğe) {return jQuery ('# zip_endvalue'). Val ()> jQuery ('# zip_startvalue'). Val ()}, "* Posta kodu sonu değer, Posta kodu başlangıç ​​değerinden büyük olmalıdır ");
Balasuresh Asaithambi

Bu, Google Chrome'da bir hata oluşturur. 12'den küçük veya 31'den büyük bir değer iletirseniz, tarih olarak ayrıştırılır ve dolayısıyla tarih olarak da doğrulanır. Bunu iki yönteme ayırmak zorunda kaldım (aceleyle), ancak daha uygun bir çözüm bulmayı çok isterim!
sbsatter

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

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

Bence bunu yapmalı


Sağ? Teşekkürler! Eklentiye gerek yok. : P
Vael Victus

1
güzel ve uygulaması kolay, jQuery.validate harika olsa da
mknopf

Çok teşekkürler .. çok kolay.
Nimit Joshi

tek sorun, iki yıla yayılan bir tarih aralığına sahip olmanızdır, ör. 27-06-2015 - 02-02-2016 .... doğru şekilde onaylanmayacak
Himansz

Örneğin iki yıla yayılan böyle bir tarih aralığı. 27-06-2015 - 02-02-2016, benim için uygun şekilde doğrulandı.
Thamarai T

19

Partiye biraz geç ama işte benim bölümüm

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

İşte detay:

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

Referans jquery.validate.js ve jquery-1.2.6.js. Başlangıç ​​tarihi metin kutunuza bir startDate sınıfı ekleyin. Bitiş tarihi metin kutunuza bir endDate sınıfı ekleyin.

Bu komut dosyası bloğunu sayfanıza ekleyin: -

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

Bu yardımcı olur umarım :-)


Bu tekniği beğendim
wahmal

13

Sadece danteuno'nun cevabıyla uğraşıyordum ve iyi niyetli olsa da, ne yazık ki IE olmayan birkaç tarayıcıda bozuk olduğunu gördüm . Bunun nedeni, IE'nin kurucuya argüman olarak neyi kabul ettiği konusunda oldukça katı Dateolacak, ancak diğerleri olmayacak. Örneğin, Chrome 18,

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

Bu, kodun "tarihleri ​​karşılaştır" yolunu almasına neden olur ve her şey buradan yokuş aşağı gider (örneğin new Date("11"), daha büyüktür new Date("66")ve bu, istenen etkinin açıkça tersidir).

Bu nedenle, üzerinde düşündükten sonra, "tarihler" yolu üzerinden "sayılar" yoluna öncelik vermek için kodu değiştirdim ve girdinin JavaScript'te ondalık sayıları doğrula - IsNumeric () 'de sağlanan mükemmel yöntemle gerçekten sayısal olduğunu doğruladım .

Sonunda kod şu hale gelir:

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

bu örnekte çalışıyor ama opera ve FF'de çalışmasını sağlayamıyor, herhangi bir fikir var mı?
48'de kodlandı

: Seçilen bitiş tarihi, seçilen başlangıç ​​tarihinden sonra olsa bile doğrulama hatasıyla gelir
2012'de

5

Metin alanlarındaki tarih değerleri jquery'nin .val () Yöntemi ile şu şekilde alınabilir:

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

Tarih dizelerini karşılaştırmadan önce ayrıştırmanızı şiddetle tavsiye ederim. Javascript'in Tarih nesnesinde bir parse () - Yöntem vardır, ancak yalnızca ABD tarih biçimlerini (YYYY / AA / GG) destekler. Unix döneminin başlangıcından bu yana geçen milisaniyeleri döndürür, böylece değerlerinizi> veya <ile karşılaştırabilirsiniz.

Farklı formatlar istiyorsanız (örn. ISO 8661), normal ifadelere veya ücretsiz date.js kitaplığına başvurmanız gerekir.

Süper kullanıcı dostu olmak istiyorsanız, metin alanları yerine jquery ui veri seçici kullanabilirsiniz. Tarih aralıklarının girilmesine izin veren bir tarih seçici varyantı vardır:

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


5

Bu yüzden bu kuralın isteğe bağlı olmasına ihtiyacım vardı ve yukarıdaki önerilerin hiçbiri isteğe bağlı değil. Yöntemi çağırırsam, onu bir değere ihtiyaç duyacak şekilde ayarlasam bile gerektiği gibi gösteriliyor.

Bu benim çağrım:

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

Benim addMethod, Mike E.'nin en çok oy alan cevabı kadar sağlam değil, ancak bir tarih seçimini zorlamak için JqueryUI tarih seçici kullanıyorum. Birisi bana tarihlerin sayı olduğundan nasıl emin olacağımı ve yöntemin isteğe bağlı olmasını sağlayabilirse bu harika olurdu, ancak şimdilik bu yöntem benim için çalışıyor:

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'de geliştiricilerin çoğu, tarih biçimine dönüştürmeden dize olan Başlangıç ​​& Bitiş tarih karşılaştırmasını kullanır. Tarihle karşılaştırmanın en basit yolu bugüne kadarki zamandan daha büyüktür.

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

Doğru sonuçlar elde etmek için her zaman karşılaştırmadan önce ve bugüne kadar ayrıştırın


Bu soruya bir cevap vermiyor. Yeterli itibara sahip olduğunuzda , herhangi bir gönderi hakkında yorum yapabileceksiniz ; bunun yerine soruyu soranın açıklamasını gerektirmeyen yanıtlar verin . - Yorumdan
Mamun

Soru sormak için çözüm. Denedim ve cevapladım.
Kunal Brahme

2

Franz'ın söylediklerini beğendim çünkü kullandığım şey bu: 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)
        }
    });
});

Veya bu bağlantıyı ziyaret edin


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

Umarım bu yardımcı olur :)


0

Önce, bölme işlevini kullanarak iki giriş kutusunun değerlerini bölersiniz. sonra aynı şeyi ters sırada birleştirin. concat ulus sonra tam sayıya ayrıştırır. sonra if ifadesindeki iki değeri karşılaştırın. ör. 1> 20-11-2018 2> 21-11-2018

20181120 ve 20181121 karşılaştırması için split ve concat'den sonra yeni değerler aynı şeyi karşılaştırır.

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 {

}

Lütfen bu çözümün açıklamasını ekleyin
Jan erný

0

bu çalışmalı

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

Biçimin doğru YYYY / AA / GG olması ve iki alan arasında tam olarak aynıysa, şunları kullanabilirsiniz:

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

Dize karşılaştırması olarak


jquery'de başlangıç ​​ve bitiş tarihini nasıl tanımlarım?
girdi

Normal dizeler olduklarını varsayıyorum. Bunları $ (# startdate: input) .val () ve $ (# enddate: input) .val () gibi okuyorsunuz
Nadia Alramli
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.