日历预订系统单日预订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; }
逻辑说明
wpkCompareDates辅助函数解决了Date对象时间部分干扰、字符串与Date对象混合比较的问题,确保准确判断是否为同一天。- 处理起始日期时,先验证对应的结束日期是否与当前日期相同:
- 若是起止同天,仅标记当天的两个时段,避免错误关联次日。
- 若不是,保持原逻辑。
- 处理结束日期时,跳过起止同天的情况(已在起始日期逻辑中处理),防止重复标记或错误标记次日时段。
之前尝试的问题说明
typeof Startdate == typeof Enddate:仅比较变量类型(比如都是Date对象),无法判断日期值是否相同,逻辑无效。slots.Firstslottaken == slots.Secondslottaken:仅比较两个时段的状态是否一致,和起止日期是否相同无关,无法解决Bug。
内容的提问来源于stack exchange,提问作者polish_prince
相关产品推荐
相关产品推荐

