主要问题:如何设置最接近的可用日期?
大家好,我正在使用bootstrap-datetimepicker。
我已经从日历中删除了几天,有时甚至在范围内禁用了当前日期。
所以它成功禁用但我想将默认日期预设为输入值,如果我使用defaultDate: 'moment'
它设置当前日期(被禁用)。
如何设置最接近的可用日期?
是否存在解决问题的生命危险? 或者我应该手动制作?
这就是现在的工作方式:
var $datesDisabled = [];
$.each($dates, function (key, value) {
$datesDisabled.push(moment(value))
});
// PARAMS TO DATETIMEPICKER
var $params = {
locale: 'en',
format: 'DD/MM/YYYY',
disabledDates: $datesDisabled,
};
// CHECK IF CURRENT DATE IS IN DISABLED ARRAY
if ($.inArray(moment().format('MM/DD/YYYY'), $dates) === -1) {
// IF NOT PRESET CURRENT DATE
$params.defaultDate = 'moment';
} else {
// DO NOT PRESET
$params.useCurrent = false;
}
$('.datetimepicker').datetimepicker($params);
答案 0 :(得分:1)
根据library documentation,您不应该使用defaultDate: 'moment'
。他们确实提到了以下内容:
接受:日期,时刻,字符串
但这意味着您可以提供Date
对象,moment()
对象或日期字符串。字符串"moment"
不是那些,所以它可能默认为今天。
但是,您可以像这样配置defaultDate
:
// Using a date string
$('#my-date-picker').datetimepicker({
defaultDate: '2016-08-20'
});
// Using a Date object
$('#my-date-picker').datetimepicker({
defaultDate: new Date('2016-08-20')
});
// Using a moment.js object
$('#my-date-picker').datetimepicker({
defaultDate: moment('2016-08-20')
});
但是,如果您希望根据您的停用日期确定defaultDate
最近的日期,则您必须自行计算。对于这样的功能,您可以创建一个递归函数,使用给定的日期减去或加1来回忆自己,直到找到一个未被禁用的日期。
例如:
var disabled = [
new Date('2016-01-03'),
new Date('2016-01-04'),
new Date('2016-01-05'),
new Date('2016-01-08')
];
function getClosest(date, disabled, direction) {
if(!containsDate(disabled, date)) {
return date;
} else {
var prev = getClosest(date.clone().add(direction || -1, 'days'), disabled, direction || -1),
next = getClosest(date.clone().add(direction || 1, 'days'), disabled, direction || 1);
if (Math.abs(date.diff(prev, 'days')) > Math.abs(date.diff(next, 'days'))) {
return next;
} else {
return prev;
}
}
}
function containsDate(dates, given) {
return dates.some(function(date) {
return given.isSame(date, 'day');
});
}
console.log(getClosest(moment('2016-01-02'), disabled).toDate());
console.log(getClosest(moment('2016-01-03'), disabled).toDate());
console.log(getClosest(moment('2016-01-04'), disabled).toDate());
console.log(getClosest(moment('2016-01-05'), disabled).toDate());
console.log(getClosest(moment('2016-01-06'), disabled).toDate());

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>
&#13;