Как ограничить выбранные диапазоны дат в Bootstrap Datepicker?
Мне нужно использовать datepicker, который предоставляет мне возможность ограничения выбранных дат. Мы использовали пользовательский интерфейс jQuery, который используется для его поддержки с использованием параметров minDate, maxDate.
$("#id_date").datepicker({minDate: +1, maxDate: '+1M +10D'});
Недавно мы начали использовать Twitter Bootstrap для наших стилей. И, по-видимому, Twitter Bootstrap несовместим с стилями jQuery UI. Поэтому я попытался использовать один из совместимых с bootstrap datepickers, доступных в http://www.eyecon.ro/bootstrap-datepicker/.
К сожалению, приведенный выше плагин не такой настраиваемый, как jQuery UI datepicker. Может ли кто-нибудь помочь мне с ограничением диапазонов заданных дат в новом datepicker.
Ответы
Ответ 1
Датчик даты Bootstrap может устанавливать диапазон дат. Но он недоступен в начальном выпуске/Главной ветки. Проверьте ветку как "диапазон" там (или просто посмотрите на https://github.com/eternicode/bootstrap-datepicker), вы можете сделать это просто с помощью startDate и endDate.
Пример:
$('#datepicker').datepicker({
startDate: '-2m',
endDate: '+2d'
});
Ответ 2
С выбранными диапазонами дат вы можете использовать что-то вроде этого. Мое решение предотвращает выбор #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"
И не забудьте также включить bootstrap datepicker.js и .css файлы.
Ответ 3
Приведенный выше пример может быть немного упрощен. Кроме того, вы можете вводить дату вручную с клавиатуры, а не выбирать ее только с помощью 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">
Ответ 4
Большинство ответов и объяснений не объясняют, что является допустимой строкой 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,]
Ответ 5
Другая возможность - использовать параметры с атрибутами data
, например, (минимальная дата за 1 неделю до):
<input class='datepicker' data-date-start-date="-1w">
Дополнительная информация: http://bootstrap-datepicker.readthedocs.io/en/latest/options.html
Ответ 6
Я использую 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'))
});