如何设置最近的可用日期?
How to set closest available date?
主要问题:如何设置最近的可用日期?
大家好,我正在使用 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);
根据 library documentation,您不应该使用 defaultDate: 'moment'
。他们确实提到了以下内容:
Accepts: date, moment, string
但这意味着您可以提供一个 Date
对象、一个 moment()
对象或一个日期字符串。字符串 "moment"
是其中的 none,因此它可能默认为今天。
但是,您可以这样配置 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>
主要问题:如何设置最近的可用日期?
大家好,我正在使用 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);
根据 library documentation,您不应该使用 defaultDate: 'moment'
。他们确实提到了以下内容:
Accepts: date, moment, string
但这意味着您可以提供一个 Date
对象、一个 moment()
对象或一个日期字符串。字符串 "moment"
是其中的 none,因此它可能默认为今天。
但是,您可以这样配置 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>