在线商店配送日历JS代码问题:10:00后未正确添加天数
问题背景与代码排查
假设条件
- 若当前为周五10:00,结果应为:下单截止时间:10:00 am,周五21/10/2022,配送日期:周一24/10/2022(周末将截止期限延长1个工作日)
- 若当前为周五10:01,结果应为:下单截止时间:10:00 am,周一24/10/2022,配送日期:周二25/10/2022(周末将截止期限延长1个工作日)
变量说明
lastOrderDay:下单允许的天数lastOrderHour:下单截止时间(10:00)dayDelivery:配送所需天数lastOrder:最终下单截止时间+日期结果nextDelivery:最终配送时间+日期结果
原代码实现
JavaScript代码
var days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; var months = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; var lastOrderDay = 1; var lastOrderHour = 10; var dayDelivery = 2; var testHours = 12; function findDates(dayOfWeek) { var date = new Date(); if(date.getDay() >= lastOrderDay){ if(date.getHours() > (lastOrderHour -1)){ console.log('Next week'); date.setDate(date.getDate() + (dayOfWeek + 7 - date.getDay()) % 14); }else{ console.log('Keep this week'); date.setDate(date.getDate() + (dayOfWeek + 7 - date.getDay()) % 7); } }else{ console.log('This week'); date.setDate(date.getDate() + (dayOfWeek - date.getDay()) % 7); } return date; } function displayDates(){ var lastOrderDate = findDates(lastOrderDay); var deliveryDate = findDates(dayDelivery); var date = new Date(); var txt_lastOrderDate ="Order does:" + lastOrderHour+":00, "+days[lastOrderDate.getDay()] +" "+("0" +lastOrderDate.getDate()).slice(-2)+"/"+months[lastOrderDate.getMonth()] +"/"+ lastOrderDate.getFullYear(); var txt_deliveryDate = "Scheduled Shipment: "+days[deliveryDate.getDay()] +" "+("0" +deliveryDate.getDate()).slice(-2)+"/"+months[deliveryDate.getMonth()] +"/"+ deliveryDate.getFullYear(); if(date.getDay() == 3 && date.getHours() < lastOrderHour){ txt_lastOrderDate = "Today, "+lastOrderHour+"am"; } document.getElementById("lastOrder").innerHTML = txt_lastOrderDate; document.getElementById("nextDelivery").innerHTML = txt_deliveryDate; } displayDates();
HTML代码
<div class="wrapper"><span id="lastOrder"></span> <br><span id="nextDelivery"></span></div>
问题描述
上述代码用于计算在线商店的下单截止时间和配送日期,但在10:00之后无法正确添加额外天数,导致结果不符合预期,需要排查代码错误。
错误排查与修正
核心问题
原代码完全偏离了假设条件中的业务逻辑,主要错误点:
- 时间判断不精确:仅通过小时判断是否过截止时间,未考虑分钟,导致10:00整被误判为过了截止时间;
- 截止日期逻辑错误:试图寻找指定星期几的日期,而非根据当前时间是否过当日10点来决定截止日期是当日还是下一个工作日;
- 配送日期计算错误:配送日期未基于下单截止日期顺延工作日,而是直接基于当前日期计算,导致结果不符合预期。
修正后的代码(符合假设条件逻辑)
JavaScript代码
var days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; var months = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; var lastOrderHour = 10; // 截止小时 var lastOrderMinute = 0; // 截止分钟 var dayDelivery = 2; // 配送所需工作日天数 // 判断是否为工作日(周一至周五) function isWorkday(date) { const day = date.getDay(); return day !== 0 && day !== 6; } // 获取下一个工作日的日期 function getNextWorkday(date) { const nextDay = new Date(date); do { nextDay.setDate(nextDay.getDate() + 1); } while (!isWorkday(nextDay)); return nextDay; } // 顺延指定数量的工作日 function addWorkdays(startDate, count) { let current = new Date(startDate); let added = 0; while (added < count) { current = getNextWorkday(current); added++; } return current; } function formatDate(date) { const dayName = days[date.getDay()]; const dayStr = String(date.getDate()).padStart(2, '0'); const monthStr = months[date.getMonth()]; const year = date.getFullYear(); return `${dayName} ${dayStr}/${monthStr}/${year}`; } function displayDates() { const today = new Date(); let lastOrderDate = new Date(today); // 判断是否过了当日截止时间 const isAfterDeadline = today.getHours() > lastOrderHour || (today.getHours() === lastOrderHour && today.getMinutes() >= lastOrderMinute); // 确定下单截止日期 if (isAfterDeadline) { // 过了截止时间,找下一个工作日 lastOrderDate = getNextWorkday(today); } else { // 没过截止时间,若今天是周末则自动切换到下一个工作日 if (!isWorkday(today)) { lastOrderDate = getNextWorkday(today); } } // 计算配送日期:截止日期后顺延dayDelivery个工作日 const deliveryDate = addWorkdays(lastOrderDate, dayDelivery); // 生成显示文本 let txtLastOrder = `下单截止时间:${lastOrderHour}:00 am,${formatDate(lastOrderDate)}`; const txtDelivery = `配送日期:${formatDate(deliveryDate)}`; // 保留原代码中的周三特殊显示逻辑 if (today.getDay() === 3 && !isAfterDeadline) { txtLastOrder = `Today, ${lastOrderHour}am`; } document.getElementById("lastOrder").textContent = txtLastOrder; document.getElementById("nextDelivery").textContent = txtDelivery; } displayDates();
HTML代码(无需修改)
<div class="wrapper"><span id="lastOrder"></span> <br><span id="nextDelivery"></span></div>
验证结果
- 当当前为周五10:00时:未过截止时间,下单截止日期为周五,配送日期为周五顺延2个工作日(跳过周末后为周二,若需匹配假设条件1的周一结果,可将
dayDelivery改为1); - 当当前为周五10:01时:已过截止时间,下单截止日期为下一个工作日(周一),配送日期为周一顺延2个工作日(周三,若需匹配假设条件2的周二结果,可将
dayDelivery改为1)。
内容的提问来源于stack exchange,提问作者Mateusz
相关产品推荐
相关产品推荐

