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

在线商店配送日历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之后无法正确添加额外天数,导致结果不符合预期,需要排查代码错误。


错误排查与修正

核心问题

原代码完全偏离了假设条件中的业务逻辑,主要错误点:

  1. 时间判断不精确:仅通过小时判断是否过截止时间,未考虑分钟,导致10:00整被误判为过了截止时间;
  2. 截止日期逻辑错误:试图寻找指定星期几的日期,而非根据当前时间是否过当日10点来决定截止日期是当日还是下一个工作日;
  3. 配送日期计算错误:配送日期未基于下单截止日期顺延工作日,而是直接基于当前日期计算,导致结果不符合预期。

修正后的代码(符合假设条件逻辑)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:05:22