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

如何从工作时间数组中获取下一个营业时段及日期(含跨周场景)

解决营业状态判断与跨周下一个开业日查找问题

核心问题修正与优化

需要解决两个关键问题:

  1. 原代码中直接用小时数字与时间字符串比较存在精度漏洞(如无法处理9:30这类带分钟的时间);
  2. 跨周场景下的下一个开业日查找逻辑缺失。

完整实现代码

1. 工具函数:时间转分钟数

用于统一时间比较的标准,避免字符串比较的误差:

// 将HH:mm格式的时间字符串转换为当日的分钟数
const timeToMinutes = (timeStr) => {
  const [hours, minutes] = timeStr.split(':').map(Number);
  return hours * 60 + minutes;
};

2. 主函数:获取当前营业状态

处理当前是否营业的判断,以及调用下一个开业日查找逻辑:

const getCurrentBusinessStatus = (hoursOfOperations) => {
  const currentTime = new Date();
  // 关键转换:JS的getDay()返回0=周日,而业务定义day=0=周一,需对齐
  const jsCurrentDay = currentTime.getDay();
  const adjustedCurrentDay = jsCurrentDay === 0 ? 6 : jsCurrentDay - 1;
  const currentMinutes = currentTime.getHours() * 60 + currentTime.getMinutes();

  // 检查今日是否营业
  const todayHours = hoursOfOperations.find(h => h.day === adjustedCurrentDay);
  if (todayHours && todayHours.isOpen === 1) {
    const startMinutes = timeToMinutes(todayHours.startHour);
    const endMinutes = timeToMinutes(todayHours.endHour);
    if (currentMinutes >= startMinutes && currentMinutes < endMinutes) {
      return {
        type: 'open',
        message: `当前营业,${todayHours.endHour}闭店`
      };
    }
  }

  // 当前不营业,查找下一个开业日
  return findNextOpeningDay(hoursOfOperations, adjustedCurrentDay);
};

3. 辅助函数:查找下一个开业日(支持跨周)

通过循环+取模运算覆盖整周,确保找到最早的下一个开业日:

const findNextOpeningDay = (hoursOfOperations, currentDay) => {
  // 对应业务定义的星期名称:day=0=周一,day=6=周日
  const dayNames = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
  
  // 循环检查接下来的7天(含跨周情况)
  for (let i = 1; i <= 7; i++) {
    const targetDay = (currentDay + i) % 7;
    const dayHours = hoursOfOperations.find(h => h.day === targetDay);
    
    if (dayHours && dayHours.isOpen === 1) {
      const daysLater = i;
      let message = '';
      if (daysLater === 1) {
        message = `明日${dayHours.startHour}开业`;
      } else {
        message = `下${dayNames[targetDay]}${dayHours.startHour}开业`;
      }
      return {
        type: 'closed',
        message
      };
    }
  }

  // 整周无开业日期
  return {
    type: 'closed',
    message: '暂时歇业'
  };
};

4. 使用示例

// 传入你的营业数据数组
const businessStatus = getCurrentBusinessStatus(hoursOfOperations);
console.log(businessStatus.message);

关键说明

  • 时间精度处理:通过分钟数比较,支持任意HH:mm格式的营业时间,避免字符串比较的逻辑错误;
  • 日期对齐:解决JS原生日期函数与业务定义的星期索引不一致问题,确保日期匹配准确;
  • 跨周场景覆盖:通过(currentDay + i) % 7实现循环检查,无论当前是周几,都能找到最早的下一个开业日;
  • 整周歇业判断:循环7天后未找到开业日期,直接返回"暂时歇业"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:47:48