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

时间:2016-08-16 08:34:24

标签: javascript jquery twitter-bootstrap bootstrap-datetimepicker

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

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

1 个答案:

答案 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;
&#13;
&#13;