Как ограничить выбор диапазонов дат в Bootstrap Datepicker?

Мне нужно использовать datepicker, который предоставляет мне возможность ограничения выбираемых дат. Мы использовали jQuery UI, который используется для его поддержки с помощью параметров minDate, maxDate.

$("#id_date").datepicker({minDate: +1, maxDate: '+1M +10D'}); 

недавно мы начали использовать Twitter Bootstrap для наших стилей. И, по-видимому, Twitter Bootstrap несовместим со стилями пользовательского интерфейса jQuery. Поэтому я попытался использовать один из совместимых с bootstrap datepickers, доступных вhttp://www.eyecon.ro/bootstrap-datepicker/.

к сожалению, вышеупомянутый плагин не так настраивается, как datepicker jQuery UI. Может ли кто-нибудь помочь мне с ограничением выбираемых диапазонов дат в новом datepicker.

6 ответов


загрузочный datepicker может установить диапазон дат. Но он недоступен в ветви начального выпуска/Master. Проверьте ветку как "диапазон" там (или просто см. вhttps://github.com/eternicode/bootstrap-datepicker), Вы можете сделать это просто с startDate и endDate.

пример:

$('#datepicker').datepicker({
    startDate: '-2m',
    endDate: '+2d'
});

С выбираемыми диапазонами дат вы можете использовать что-то вроде этого. Мое решение предотвращает выбор #from_date больше, чем #to_date, и изменяет #to_date startDate каждый раз, когда пользователь выбирает новую дату в поле #from_date:

http://bootply.com/74352

JS-файла:

var startDate = new Date('01/01/2012');
var FromEndDate = new Date();
var ToEndDate = new Date();

ToEndDate.setDate(ToEndDate.getDate()+365);

$('.from_date').datepicker({

    weekStart: 1,
    startDate: '01/01/2012',
    endDate: FromEndDate, 
    autoclose: true
})
    .on('changeDate', function(selected){
        startDate = new Date(selected.date.valueOf());
        startDate.setDate(startDate.getDate(new Date(selected.date.valueOf())));
        $('.to_date').datepicker('setStartDate', startDate);
    }); 
$('.to_date')
    .datepicker({

        weekStart: 1,
        startDate: startDate,
        endDate: ToEndDate,
        autoclose: true
    })
    .on('changeDate', function(selected){
        FromEndDate = new Date(selected.date.valueOf());
        FromEndDate.setDate(FromEndDate.getDate(new Date(selected.date.valueOf())));
        $('.from_date').datepicker('setEndDate', FromEndDate);
    });

HTML-код:

<input class="from_date" placeholder="Select start date" contenteditable="false" type="text">
<input class="to_date" placeholder="Select end date" contenteditable="false" type="text" 

и не забудьте включить загрузочный datepicker.js and .css файлы также.


приведенный выше пример можно немного упростить. Кроме того, вы можете поместить дату вручную с клавиатуры, а не выбирать ее только через datepicker. При очистке значения вам также необходимо обработать 'on clearDate' действие по удалению границы startDate/endDate:

JS-файла:

$(".from_date").datepicker({
    format: 'yyyy-mm-dd',
    autoclose: true,
}).on('changeDate', function (selected) {
    var startDate = new Date(selected.date.valueOf());
    $('.to_date').datepicker('setStartDate', startDate);
}).on('clearDate', function (selected) {
    $('.to_date').datepicker('setStartDate', null);
});

$(".to_date").datepicker({
    format: 'yyyy-mm-dd',
    autoclose: true,
}).on('changeDate', function (selected) {
    var endDate = new Date(selected.date.valueOf());
    $('.from_date').datepicker('setEndDate', endDate);
}).on('clearDate', function (selected) {
    $('.from_date').datepicker('setEndDate', null);
});

HTML-код:

<input class="from_date" placeholder="Select start date" type="text" name="from_date">
<input class="to_date" placeholder="Select end date" type="text" name="to_date">

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

$('#datepicker').datepicker({
    startDate: '-2m',
    endDate: '+2d'
});

но почему?давайте посмотрим на исходный код в bootstrap-datetimepicker.js. Есть некоторый код начала строки 1343 расскажите нам, как это работает.

if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) {
            var part_re = /([-+]\d+)([dmwy])/,
                parts = date.match(/([-+]\d+)([dmwy])/g),
                part, dir;
            date = new Date();
            for (var i = 0; i < parts.length; i++) {
                part = part_re.exec(parts[i]);
                dir = parseInt(part[1]);
                switch (part[2]) {
                    case 'd':
                        date.setUTCDate(date.getUTCDate() + dir);
                        break;
                    case 'm':
                        date = Datetimepicker.prototype.moveMonth.call(Datetimepicker.prototype, date, dir);
                        break;
                    case 'w':
                        date.setUTCDate(date.getUTCDate() + dir * 7);
                        break;
                    case 'y':
                        date = Datetimepicker.prototype.moveYear.call(Datetimepicker.prototype, date, dir);
                        break;
                }
            }
            return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), 0);
        }

существует четыре вида выражений.

  • w значит неделю
  • m означает месяц
  • y означает год
  • d день

посмотрите на регулярное выражение ^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$. Вы можете сделать больше, чем эти -0d или +1m.

стараться как startDate:'+1y,-2m,+0d,-1w'.И разделитель!--13--> может быть одним из [\f\n\r\t\v,]


еще одна возможность-использовать опции с data атрибуты, как это(минимальная дата за 1 неделю до этого):

<input class='datepicker' data-date-start-date="-1w">

Подробнее: http://bootstrap-datepicker.readthedocs.io/en/latest/options.html


Я использую v3.1.3 и мне пришлось использовать data('DateTimePicker') такой

var fromE = $( "#" + fromInput );
var toE = $( "#" + toInput );
$('.form-datepicker').datetimepicker(dtOpts);

$('.form-datepicker').on('change', function(e){
   var isTo = $(this).attr('name') === 'to';

   $( "#" + ( isTo ? fromInput : toInput  ) )
      .data('DateTimePicker')[ isTo ? 'setMaxDate' : 'setMinDate' ](moment($(this).val(), 'DD/MM/YYYY'))
});