2009-05-07 5 views

ответ

151

Просто расширяющееся от слитых ответить. этот метод расширения работает с использованием плагина 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" } 
    } 
}); 
+0

Как вы используете это с двумя текстовыми полями? – Cros

+1

rules {texbox: {greaterThan: [textbox2.val()]}} или что-то в этом роде. –

+0

Мне пришлось немного изменить его, чтобы пустые даты окончания в моем приложении, но это делало большую часть. 'code' if (value == 0) { return true; } else if (!/Invalid | NaN/... 'code' –

-2

Если формат гарантированно правильно YYYY/MM/DD и точно так же между этими двумя областями, то вы можете использовать:

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

В сравнении строк

+0

Как определить начальную и конечную даты в jquery? – input

+0

Я предполагаю, что они обычные строки. Вы читаете их так: $ (# startdate: input) .val() и $ (# enddate: input) .val() –

+0

Пожалуйста, переформатируйте этот ответ ... – rickyduck

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

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

Это должно сделайте это, я думаю

+0

В порядке? Благодаря! Плагин не нужен. : P –

+0

Ницца. Простой код ... – Pramod

+0

приятный и простой в использовании, хотя jQuery.validate является удивительным – mknopf

5

Значения даты из текстовых полей могут быть получены с помощью .val() метода jquery как

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

Я бы рекомендовал проанализировать строки даты перед их сопоставлением. Объект Date Javascript имеет метод parse() - Method, но поддерживает только форматы дат США (YYYY/MM/DD). Он возвращает миллисекунды с начала эпохи unix, поэтому вы можете просто сравнить свои значения с> или <.

Если вы хотите использовать разные форматы (например, ISO 8661), вам необходимо использовать регулярные выражения или бесплатную библиотеку date.js.

Если вы хотите быть супер-пользователем, вы можете использовать jquery ui datepickers вместо текстовых полей. Существует вариант DatePicker, что позволяет ввести диапазон дат:

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

14

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

Надеется, что это помогает :-)

+0

Мне нравится эта техника – wahmal

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; 
} 
13

Я просто возился с danteuno's answer и обнаружил, что в то время как благие намерения, к сожалению, он разбит на несколько браузеров, которые не 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"), и это, очевидно, противоположно желаемому эффекту).

Поэтому после рассмотрения я изменил код, чтобы уделить приоритет пути «числа» по пути «даты» и подтвердил, что ввод действительно является числовым с отличным методом, представленным в Validate decimal numbers in 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}.'); 
+0

это работает в ie, но не может заставить его работать в опере и FF, какие-нибудь идеи? – Codded

+0

@Codded: Как именно он не работает? – Jon

+0

: Приходит ошибка проверки, даже если выбранная дата окончания после выбранной даты начала – Codded

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

Надеется, что это поможет :)

3

Так что мне нужно это правило будет необязательными, и ни один из вышеперечисленных предложений не являются обязательными. Если я вызываю метод, он отображается по мере необходимости, даже если я задал ему значение.

Это мой призыв:

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

Мой addMethod не так надежен, как популярнейший ответ Mike E., но я использую DatePicker 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.'); 
15

Немного опоздал на вечеринку, но вот моя часть

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

Или Посещение этого link

1
jQuery('#from_date').on('change', function(){ 
    var date = $(this).val(); 
    jQuery('#to_date').datetimepicker({minDate: date}); 
}); 
1

В JavaScript/JQuery большинство разработчиков использует от & Для сравнения дат, который является строкой, без преобразования в формат даты. Самый простой способ сравнить с датой больше, чем на сегодняшний день.

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

Всегда синтаксический от и до настоящего времени перед сравнением, чтобы получить точные результаты

+0

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (https://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (https://stackoverflow.com/help/privileges/comment); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- я-делать-вместо этого). - [Из обзора] (/ review/low-quality-posts/18026392) – Mamun

+0

Это решение вопроса. Я попробовал и ответил. –

Смежные вопросы