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

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

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

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

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


person Alagappan Ramu    schedule 13.08.2012    source источник
comment
если средство выбора даты jQuery работает, за исключением стилей, может быть проще отключить эти стили, чем добавлять несуществующие функции в другую библиотеку. Взгляните на вкладку "Темы" на jqueryui.com/demos/datepicker.   -  person dnagirl    schedule 13.08.2012
comment
Возможно, этот ответ поможет вам.   -  person SHIVA    schedule 25.02.2020


Ответы (6)


Средство выбора даты Bootstrap может устанавливать диапазон дат. Но он недоступен в начальном выпуске/Master Branch. Проверьте ветку как «диапазон» (или просто посмотрите на https://github.com/eternicode/bootstrap-datepicker ), вы можете сделать это просто с startDate и endDate.

Пример:

$('#datepicker').datepicker({
    startDate: '-2m',
    endDate: '+2d'
});
person Danny    schedule 27.08.2012
comment
@NandhakumarSri Вот, пожалуйста, github.com/eternicode/bootstrap-datepicker. Было несколько изменений в древовидной структуре репозитория, из-за которых не работала ссылка на ответ. - person Alagappan Ramu; 10.09.2013
comment
что это за '-2m' и +2d? - person Gaurav Aggarwal; 01.04.2016
comment
@GauravAggarwal На всякий случай .. должны быть месяцы (м) и дни (д); т. е. действительная дата — от 2 месяцев до сегодняшнего дня до 2 дней после сегодняшнего дня. - person panhandel; 06.07.2016

С выбираемыми диапазонами дат вы можете использовать что-то вроде этого. Мое решение не позволяет выбирать #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 и .css.

person user2586273    schedule 15.08.2013

Пример выше можно немного упростить. Кроме того, вы можете ввести дату вручную с клавиатуры, а не выбирать ее только с помощью средства выбора даты. При очистке значения необходимо также обработать действие '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">
person Marek    schedule 17.04.2014
comment
Оно работает!!! Просто обратите внимание, что .valueOf() у меня не работает, потому что datepicker проверяет дату в setStartDate. - person azuax; 28.04.2015
comment
На дворе 2020 год, а ваш код все еще работает! Кстати как добавить 1 день в .to_date ??? - person Wilf; 13.02.2020

Большинство ответов и объяснений не объясняют, что является допустимой строкой 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'. И разделитель , может быть одним из [\f\n\r\t\v,]

person FavorMylikes    schedule 04.01.2016
comment
Это правильный и идеальный ответ. Принятый ответ мог решить проблему спрашивающего, но более подробное описание решения добавит ему ценности. - person Sanket Patel; 22.06.2016

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

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

Дополнительная информация: http://bootstrap-datepicker.readthedocs.io/en/latest/options.html

person overallduka    schedule 18.09.2017

я использую 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'))
});
person bresleveloper    schedule 26.07.2016