如何限制 Bootstrap Datepicker 中的可选日期范围?

IT技术 javascript twitter-bootstrap datepicker bootstrap-datepicker
2021-02-02 17:00:59

我需要使用 datepicker,它为我提供了限制可选日期的选项。我们一直在使用 jQuery UI,它使用 minDate、maxDate 选项来支持它。

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

最近我们开始为我们的样式使用 Twitter Bootstrap。显然,Twitter Bootstrap 与 jQuery UI 样式不兼容。所以我尝试使用http://www.eyecon.ro/bootstrap-datepicker/ 上提供的与引导程序兼容的日期选择器之一

不幸的是,上面的插件不像 jQuery UI 的日期选择器那样可配置。任何人都可以帮助我限制新日期选择器中的可选日期范围。

6个回答

Bootstrap 日期选择器能够设置日期范围。但它在初始版本/主分支中不可用。在那里检查分支为“范围”(或仅在https://github.com/eternicode/bootstrap-datepicker 上查看),您只需使用 startDate 和 endDate 即可。

例子:

$('#datepicker').datepicker({
    startDate: '-2m',
    endDate: '+2d'
});
@NandhakumarSri 给你 - github.com/eternicode/bootstrap-datepicker由于答案链接不起作用,存储库的树结构发生了一些变化。
2021-03-15 17:00:59
这是什么'-2m'以及+2d所有关于
2021-04-02 17:00:59
@GauravAggarwal 以防万一..应该是月(m)和天(d);即,有效日期是今天之前的 2 个月到今天的过去 2 天
2021-04-08 17:00:59

对于可选择的日期范围,您可能想要使用这样的东西。我的解决方案防止选择大于 #to_date 的 #from_date 并在每次用户在 #from_date 框中选择新日期时更改 #to_date startDate:

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 文件。

上面的例子可以简化一点。此外,您可以从键盘手动输入日期,而不是仅通过日期选择器选择它。清除值时,您还需要处理'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">
有用!!!请注意 .valueOf() 对我不起作用,因为 datepicker 检查 setStartDate 中的日期。
2021-03-21 17:00:59
现在是 2020 年,您的代码仍然有效!顺便说一下,如何将 1 天添加到.to_date???
2021-04-12 17:00:59

大多数答案和解释都不是为了解释什么是有效的endDateor字符串startDateDanny 给了我们两个有用的例子。

$('#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'.And 分隔符,可能是其中之一[\f\n\r\t\v,]

这是正确而完美的答案。接受的答案可能已经解决了提问者的问题,但提供更多关于解决方案的描述会增加它的value。
2021-03-24 17:00:59

另一种可能性是使用带有data属性的选项,如下所示(最少日期为 1 周前):

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

更多信息:http : //bootstrap-datepicker.readthedocs.io/en/latest/options.html