如何设置最近的可用日期?

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>