如何设置最近可用日期

How to set closest available date?

本文关键字:最近 日期 设置 何设置      更新时间:2023-09-26

主要问题:如何设置最接近的可用日期?

大家好,我正在使用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);

根据库文档,您不应该使用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>