Підтвердьте, що кінцева дата перевищує дату початку jQuery


Відповіді:


177

Просто розширюючи відповідь на спалах. цей метод розширення працює з використанням плагіна jQuery validate. Він підтвердить дати та номери

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

Як ви користуєтеся цим двома текстовими полями?
Крос

1
Мені довелося трохи змінити його, щоб дозволити пусті кінцеві дати в моєму додатку, але це зробило основну масу. codeif (значення == 0) {return true; } else if (! / Недійсний | NaN / ...code
Френк Люк

3
Попередження про помилку: Я розумію, що питання стосується дати, але цей код не працюватиме для рекламованих номерів. Я додав відповідь, що пояснює, чому і як, що також включає виправлення.
Джон

1
@Cros jQuery.validator.addMethod ("zip_code_checking", функція (значення, елемент) {return jQuery ('# zip_endvalue'). Val ()> jQuery ('# zip_startvalue'). Val ()}, "* поштовий індекс значення повинно бути більше, ніж початкове значення поштового індексу ");
Баласуреш Асайтамбі

Це спричиняє помилку в Google Chrome. Якщо ви передасте значення менше 12 або більше 31, воно в кінцевому підсумку буде проаналізовано як дата, а значить, воно також перевірено як дату. Мені довелося розділити це на два методи (поспішаючи), але я хотів би знайти більш підходяще рішення!
sbsatter

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

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

Думаю, це повинно зробити це


Правильно? Дякую! Плагін не потрібен. : P
Vael Victus

1
приємний і простий у виконанні, хоча jQuery.validate є приголомшливим
mknopf

Дякую багато .. так просто.
Німіт Джоші

єдина проблема, коли у вас є діапазон дат, що охоплює два роки, наприклад. 27-06-2015 по 02-02-2016 .... це не буде підтверджено належним чином
Himansz

Такий діапазон дат охоплює протягом двох років, наприклад. 27-06-2015 по 02.02.2016, для мене підтверджено належним чином.
Тамарай 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>

Сподіваюся, це допомагає :-)


мені подобається ця техніка
вахмал

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

це працює в тобто, але не можу змусити його працювати в опері та FF, будь-які ідеї?
Зашифровано

: Виникає помилка перевірки, навіть якщо вибрана кінцева дата закінчується після обраної дати початку
Зашифровано

5

Значення дати з текстових полів можна отримати методом jquery's .val ()

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

Я настійно рекомендую проаналізувати рядки дати, перш ніж порівнювати їх. Об'єкт Date Javascript має синтаксичний аналіз () - метод, але він підтримує лише формати дати США (РРР / ММ / DD). Він повертає мілісекунди з початку епохи unix, тому ви можете просто порівняти свої значення з> або <.

Якщо вам потрібні різні формати (наприклад, ISO 8661), вам потрібно вдатися до регулярних виразів або до безкоштовної бібліотеки date.js.

Якщо ви хочете бути надзвичайно захищеними користувачами, замість текстових полів ви можете використовувати jquery ui datapickers. Існує варіант вибору дати, який дозволяє вводити діапазони дат:

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не така надійна, як найкраща відповідь Майка Е., але я використовую підбірник дат JqueryUI для примусового вибору дати. Якщо хтось може сказати мені, як переконатися, що дати є цифрами, і метод має бути необов'язковим, але це було б чудово, але наразі цей метод працює для мене:

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 більшість розробників використовує порівняння «Від дати та дати», яке є рядковим, без перетворення у формат дати. Найпростіший спосіб порівняння за датою - більший, ніж на сьогоднішній день.

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

Завжди розбирайте від та до дати перед порівнянням, щоб отримати точні результати


Це не дає відповіді на запитання. Коли у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію ; натомість надайте відповіді, які не потребують уточнення від запитувача . - З огляду
Мамун

Це рішення питання. Я спробував і відповів.
Kunal Brahme

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

Спочатку ви розділите значення двох вхідних вікон за допомогою функції розділення. потім накресліть те саме у зворотному порядку. після стислої нації розберіть його на ціле число. потім порівняйте два значення в операторі if. напр.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ý

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 і однаковий між двома полями, ви можете використовувати:

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

Як рядкове порівняння


як я визначаю початковий і кінцевий термін у jquery?
вхід

Я припускаю, що вони є звичайними рядками. Ви читаєте їх так, як $ (# startdate: input) .val () та $ (# enddate: input) .val ()
Надія Алрамлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.