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

日历预订系统单日预订Bug修复:起止日期相同的槽位处理逻辑

问题描述
  • 是否可以编写判断语句,当起止日期相同时禁用该日期?
  • 日历预订系统存在Bug:用户预订单日时,系统会同时预订次日时段。计划添加逻辑:当起止日期相同时,仅预订当天两个时段,但无法正确实现该逻辑。

现有代码

function wpkGetThisDateSlots(date) {
  var slots = {
    isFirstSlotTaken: false,
    isSecondSlotTaken: false,
  };

  if (typeof disabledDates !== 'undefined') {
    if (wpkIsDateInArray(date, wpkStartDates)) {
      slots.isFirstSlotTaken = slots.isSecondSlotTaken = true;
      return slots;
    }
    if (typeof disabledDates !== 'undefined') {
      if (wpkIsDateInArray(date, wpkEnddate)) {
        slots.isFirstSlotTaken = slots.isSecondSlotTaken = true;
        return slots;
      }
    }
  }
}

尝试过的无效逻辑

if (typeof Startdate == typeof Enddate ) 

或

if (slots.Firstslottaken == slots.Secondslottaken) {

}
解决方案

核心思路

判断起止日期是否相同,不能比较变量类型,必须比较日期的实际值。先统一日期格式(比如转为YYYY-MM-DD字符串),再判断是否相等;之后针对起止同天的情况,单独处理slot标记逻辑,避免影响次日。

修改后的代码示例

// 辅助函数:统一日期格式,比较两个日期是否为同一天
function wpkCompareDates(date1, date2) {
  const formatDate = d => typeof d === 'string' ? d : d.toISOString().split('T')[0];
  return formatDate(date1) === formatDate(date2);
}

function wpkGetThisDateSlots(date) {
  var slots = {
    isFirstSlotTaken: false,
    isSecondSlotTaken: false,
  };

  if (typeof disabledDates !== 'undefined') {
    // 检查当前日期是否为起始日期
    if (wpkIsDateInArray(date, wpkStartDates)) {
      const startIndex = wpkStartDates.findIndex(d => wpkCompareDates(d, date));
      // 找到对应的结束日期,判断是否和当前日期相同
      if (startIndex !== -1 && wpkCompareDates(wpkEnddate[startIndex], date)) {
        // 起止日期相同,标记当天两个时段为已占用
        slots.isFirstSlotTaken = slots.isSecondSlotTaken = true;
      } else {
        // 普通起始日期,保持原逻辑
        slots.isFirstSlotTaken = slots.isSecondSlotTaken = true;
      }
      return slots;
    }
    // 检查当前日期是否为结束日期(跳过起止同天的情况)
    if (wpkIsDateInArray(date, wpkEnddate)) {
      const endIndex = wpkEnddate.findIndex(d => wpkCompareDates(d, date));
      if (endIndex !== -1 && !wpkCompareDates(wpkStartDates[endIndex], date)) {
        // 非起止同天的结束日期,标记时段为已占用
        slots.isFirstSlotTaken = slots.isSecondSlotTaken = true;
      }
      return slots;
    }
  }
  return slots;
}

逻辑说明

  1. wpkCompareDates辅助函数解决了Date对象时间部分干扰、字符串与Date对象混合比较的问题,确保准确判断是否为同一天。
  2. 处理起始日期时,先验证对应的结束日期是否与当前日期相同:
    • 若是起止同天,仅标记当天的两个时段,避免错误关联次日。
    • 若不是,保持原逻辑。
  3. 处理结束日期时,跳过起止同天的情况(已在起始日期逻辑中处理),防止重复标记或错误标记次日时段。

之前尝试的问题说明

  • typeof Startdate == typeof Enddate:仅比较变量类型(比如都是Date对象),无法判断日期值是否相同,逻辑无效。
  • slots.Firstslottaken == slots.Secondslottaken:仅比较两个时段的状态是否一致,和起止日期是否相同无关,无法解决Bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 07:14:55