Подтвердить что ты не робот

Подтвердить дату в формате dd/mm/yyyy с помощью JQuery Validate

Я принимаю во внимание дату рождения и дату смерти. Требуется подтверждение

  • дата смерти должна быть больше, чем дата рождения.
  • Формат даты dd/mm/yyyy
  • Даты будут меньше или равно сегодняшнему.

Проверка не работает должным образом и не может решить проблему. Пожалуйста, помогите.

Код скрипта

Используемые библиотеки JS

  • Пользовательский интерфейс JQuery для Calendar/Datepicker
  • Проверка JQuery для проверки формы
  • Дополнительные методы для библиотеки валидации

    var today = new Date();
    var authorValidator = $("#itemAuthorForm").validate({
    rules : {
        dateOfBirth : {
            required : false,
            date : true,
            dateITA : true,
            dateLessThan : '#expiredDate'
        },
        expiredDate : {
            required : false,
            date : true,
            dateITA : true,
            dateGreaterThan : "#dateOfBirth"
        }
    },
    onfocusout : function(element) {
        if ($(element).val()) {
            $(element).valid();
        }
    }
    });
    var dateOptionsDOE = {
    maxDate : today,
    dateFormat : "dd/mm/yy",
    changeMonth : true,
    changeYear : true,
    onClose : function(selectedDate) {
        $("#dateOfBirth").datepicker("option", "maxDate", selectedDate);
    }
    };
    var dateOptionsDOB = {
    maxDate : today,
    dateFormat : "dd/mm/yy",
    changeMonth : true,
    changeYear : true,
    onClose : function(selectedDate) {
        $("#expiredDate").datepicker("option", "minDate", selectedDate);
    }
     };
    
    jQuery.validator.addMethod("dateGreaterThan",
    function(value, element, params) {
    if ($(params).val() === "")
        return true;
    
    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}.');
            jQuery.validator.addMethod("dateLessThan",
            function(value, element, params) {
    if ($(params).val() === "")
        return true;
    
    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 less than {0}.');
            $("#expiredDate").datepicker(
        $.extend({}, $.datepicker.regional['en-GB'], dateOptionsDOE));
            $("#dateOfBirth").datepicker(
        $.extend({}, $.datepicker.regional['en-GB'], dateOptionsDOB));
    
4b9b3361

Ответ 1

Вам не нужен валидатор date. Он не поддерживает формат dd/mm/yyyy, и поэтому вы получаете сообщение "Пожалуйста, введите действительную дату" для ввода, например, 13/01/2014. У вас уже есть валидатор dateITA, который использует формат dd/mm/yyyy по мере необходимости.

Как и валидатор date, ваш код для dateGreaterThan и dateLessThan вызывает new Date для строки ввода и имеет те же самые результаты анализа. Вы можете использовать такую ​​функцию, чтобы проанализировать дату:

function parseDMY(value) {
    var date = value.split("/");
    var d = parseInt(date[0], 10),
        m = parseInt(date[1], 10),
        y = parseInt(date[2], 10);
    return new Date(y, m - 1, d);
}

Ответ 2

Это также проверяет в високосном году. Это чистое регулярное выражение, поэтому оно быстрее, чем любая библиотека (также быстрее, чем moment.js). Но если вы собираетесь использовать много дат в вашем коде, я рекомендую использовать moment.js

var dateRegex = /^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-.\/])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;

console.log(dateRegex.test('21/01/1986'));

enter image description here

http://regexper.com/....

Ответ 3

Если вы используете библиотеку js момента, это легко сделать так:

jQuery.validator.addMethod("validDate", function(value, element) {
        return this.optional(element) || moment(value,"DD/MM/YYYY").isValid();
    }, "Please enter a valid date in the format DD/MM/YYYY");

Ответ 4

В моем проекте возникла аналогичная проблема. После многого, я нашел это решение:

if ($.datepicker.parseDate("dd/mm/yy","17/06/2015") > $.datepicker.parseDate("dd/mm/yy","20/06/2015"))
    // do something

Вам не нужны плагины, такие как jQuery Validate или Moment.js для этой проблемы. Надеемся, что это решение поможет.

Ответ 5

Это отлично работает для меня.

$(document).ready(function () {
       $('#btn_move').click( function(){
           var dateformat = /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/;
           var Val_date=$('#txt_date').val();
               if(Val_date.match(dateformat)){
              var seperator1 = Val_date.split('/');
              var seperator2 = Val_date.split('-');

              if (seperator1.length>1)
              {
                  var splitdate = Val_date.split('/');
              }
              else if (seperator2.length>1)
              {
                  var splitdate = Val_date.split('-');
              }
              var dd = parseInt(splitdate[0]);
              var mm  = parseInt(splitdate[1]);
              var yy = parseInt(splitdate[2]);
              var ListofDays = [31,28,31,30,31,30,31,31,30,31,30,31];
              if (mm==1 || mm>2)
              {
                  if (dd>ListofDays[mm-1])
                  {
                      alert('Invalid date format!');
                      return false;
                  }
              }
              if (mm==2)
              {
                  var lyear = false;
                  if ( (!(yy % 4) && yy % 100) || !(yy % 400))
                  {
                      lyear = true;
                  }
                  if ((lyear==false) && (dd>=29))
                  {
                      alert('Invalid date format!');
                      return false;
                  }
                  if ((lyear==true) && (dd>29))
                  {
                      alert('Invalid date format!');
                      return false;
                  }
              }
          }
          else
          {
              alert("Invalid date format!");

              return false;
          }
       });
   });

Ответ 6

Это проверяет даты дд/мм/ггг. Отредактируйте свой jquery.validate.js и добавьте их.

Ссылка (регулярное выражение): регулярное выражение для проверки формата даты дд/мм/гггг

dateBR: function( value, element ) {
    return this.optional(element) || /^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/.test(value);
}

messages: {
    dateBR: "Invalid date."
}

classRuleSettings: {
    dateBR: {dateBR: true}
}

Использование:

$( "#myForm" ).validate({
    rules: {
        field: {
            dateBR: true
        }
    }
});