如何从工作时间数组中获取下一个营业时段及日期(含跨周场景)
解决营业状态判断与跨周下一个开业日查找问题
核心问题修正与优化
需要解决两个关键问题:
- 原代码中直接用小时数字与时间字符串比较存在精度漏洞(如无法处理
9:30这类带分钟的时间); - 跨周场景下的下一个开业日查找逻辑缺失。
完整实现代码
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
相关产品推荐
相关产品推荐

