Node.js中如何判断星期几是否处于餐厅设定的营业日期区间内
Node.js 餐厅营业星期判断实现方案
前提约定
JS 内置Date对象的getDay()方法会返回0到6的整数,对应规则为:0=周日、1=周一、2=周二、3=周三、4=周四、5=周五、6=周六。
建议你在DB中直接存储营业起始日、结束日对应该规则的数值,无需额外做映射转换,降低出错概率。如果目前已经存储了星期字符串,可通过如下映射表转换:
const weekDayMap = { '周日': 0, '周一': 1, '周二': 2, '周三': 3, '周四': 4, '周五': 5, '周六': 6 };
核心判断函数
该函数同时兼容常规连续营业区间(比如周一到周五)、跨周日的特殊营业区间(比如周四到下周二):
/** * 校验日期是否属于餐厅营业星期范围 * @param {number} startWeekDay 营业起始日(对应getDay返回值) * @param {number} endWeekDay 营业结束日(对应getDay返回值) * @param {Date} [checkDate=new Date()] 待校验的日期,默认取当前服务器时间 * @returns {boolean} true=可下单,false=歇业不可下单 */ function isAllowedOrderDate(startWeekDay, endWeekDay, checkDate = new Date()) { const targetWeekDay = checkDate.getDay(); // 常规区间:起始日序号小于等于结束日,比如周一(1)到周五(5) if (startWeekDay <= endWeekDay) { return targetWeekDay >= startWeekDay && targetWeekDay <= endWeekDay; } // 跨周日的区间:比如周五(5)到下周二(2) return targetWeekDay >= startWeekDay || targetWeekDay <= endWeekDay; }
你的场景使用示例
你的需求是周一到周五营业,对应起始值1、结束值5,调用方式如下:
// 从DB取出餐厅营业配置 const restaurantBizConfig = { startWeekDay: 1, endWeekDay: 5 }; // 校验当前时间是否可下单 const canOrderNow = isAllowedOrderDate(restaurantBizConfig.startWeekDay, restaurantBizConfig.endWeekDay); if (!canOrderNow) { return { code: 400, msg: '餐厅仅周一至周五营业,暂不支持下单' }; } // 校验用户选择的预约日期是否合规 const userReserveDate = new Date(userSelectedDateStr); const reserveValid = isAllowedOrderDate(restaurantBizConfig.startWeekDay, restaurantBizConfig.endWeekDay, userReserveDate);
注意事项
- 时区适配:如果服务器和餐厅所在时区不一致,需先将待校验时间转换为餐厅所在时区的时间,再获取星期值,避免时差导致判断错误,可通过
Intl.DateTimeFormat指定时区获取对应星期 - 额外歇业日期处理:如果有法定节假日、临时闭店等特殊歇业日期,可额外维护一个歇业日期集合(格式统一为
YYYY-MM-DD),在校验完星期规则后,追加判断待校验日期的格式化字符串是否在歇业集合中,存在则直接返回不可下单
内容的提问来源于stack exchange,提问作者ADEEL FAROOQ
相关产品推荐
相关产品推荐

