You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

酒店预订系统jQuery datepicker如何限制退房日期不跨不可用时段

实现方案

你只需要对原有JS逻辑做少量调整,动态计算退房日期的最大可选范围即可,完整修改后代码如下:

const dateCheck = ['2021-11-17', '2021-11-18', '2021-11-19', '2021-11-20', '2021-11-27', '2021-11-28']
// 预处理不可用日期,转为时间戳升序排列,方便后续快速查找
const sortedUnavailableTimestamps = dateCheck.map(dateStr => {
  const [year, month, day] = dateStr.split('-').map(Number)
  return new Date(year, month - 1, day).getTime()
}).sort((a, b) => a - b)

function disableDates(date) {
  var string = jQuery.datepicker.formatDate("yy-mm-dd", date);
  return [dateCheck.indexOf(string) == -1]
}

$("#listingCheckIn").datepicker({
  beforeShowDay: disableDates,
  minDate: 0,
  dateFormat: "yy-mm-dd",
  showOn: "both",
  // 选中入住日期后,动态计算退房日期的可选范围
  onSelect: function(dateText, inst) {
    const checkInDate = $(this).datepicker("getDate")
    const checkInTimestamp = checkInDate.getTime()
    let maxCheckoutDate = null

    // 找到入住日期之后第一个被占用的日期
    for (const ts of sortedUnavailableTimestamps) {
      if (ts > checkInTimestamp) {
        // 最大退房日期为被占用日期的前一天,避免和已有预订冲突
        maxCheckoutDate = new Date(ts - 24 * 60 * 60 * 1000)
        break
      }
    }

    // 同步更新退房日期的可选范围
    $("#listingCheckOut").datepicker("option", {
      minDate: checkInDate,
      maxDate: maxCheckoutDate
    })
  }
});

$("#listingCheckOut").datepicker({
  beforeShowDay: disableDates,
  minDate: 0,
  dateFormat: "yy-mm-dd"
});

逻辑说明

  • 先对所有不可用日期做预处理,转成时间戳后升序排列,后续查找效率更高
  • 用户选中入住日期后,遍历排序后的不可用日期列表,找到第一个晚于入住日期的被占用时间点
  • 将该时间点减1天作为退房日期的最大可选值:比如你选2021-11-11作为入住日期,第一个晚于它的被占用日期是2021-11-17,减1天就是2021-11-16,刚好匹配你的需求
  • 如果入住日期之后没有被占用的日期,maxDate设为null,jQuery datepicker会自动不限制最大可选时间
  • 删除了原退房日期选择器中重复设置minDate的冗余逻辑,避免无效代码执行

内容的提问来源于stack exchange,提问作者jfvii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:06:04