如何校验当前时间是否处于Zendesk API返回的周营业时间区间内
原代码存在的问题
- 遍历逻辑不合理:
map方法用于生成新数组,此处仅做逻辑校验完全没必要,且不会提前终止循环,即使已经匹配到符合条件的时段,仍然会遍历所有intervals元素,存在性能冗余。 - 变量作用域错误:
isBusinessHours定义在函数外部,多次调用函数时不会重置状态,若上一次调用返回true,后续非营业时间调用也会错误返回true。 - 重复计算冗余:每次循环都重复计算当前时间、本周起始时间,产生不必要的性能消耗。
- 可读性差:Moment.js的
weekday()方法确实是以周日为周起始(返回值0=周日,1=周一...6=周六),你当前currentDay = moment().weekday() -1的写法可以匹配intervals索引0对应周一的逻辑,但没有边界标注,后续维护容易出错。 - 时区隐患:没有显式指定时区,若服务端时区和Zendesk实例的时区不一致,会出现时间校验错误。
更优实现方案
function checkBusinessHours(intervals, targetTime = moment()) { // 如需对齐Zendesk实例时区,可在此补充tz配置,例:.tz('Asia/Shanghai') const weekStart = targetTime.clone().startOf('week'); // 提前计算当前时间相对于本周日零点的总分钟数 const currentTotalMinutes = targetTime.diff(weekStart, 'minutes'); // 当前工作日对应intervals的索引:0=周一、1=周二...4=周五 const currentWeekdayIndex = targetTime.weekday() - 1; // 匹配到符合条件的时段就终止遍历 return intervals.some((interval, index) => { if (index !== currentWeekdayIndex) return false; // 直接用分钟数比较,无需额外生成时间对象 return currentTotalMinutes >= interval.start_time && currentTotalMinutes < interval.end_time; }); }
优化说明
- 提前计算好当前时间相对于周日零点的总分钟数,直接和
intervals的数值做比较,不需要循环内生成额外的时间对象,性能提升明显。 - 用
some方法遍历,匹配到符合条件的时段就直接终止循环,避免无效遍历。 - 变量都封装在函数内部,没有全局污染问题,调用时可传入指定时间做测试,灵活性更高。
- 逻辑更直观,减少Moment API调用出错的概率。
- 预留时区配置入口,只要对齐Zendesk实例的时区,完全不会出现时间偏移问题。
内容的提问来源于stack exchange,提问作者Jack G
相关产品推荐
相关产品推荐

