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

如何校验当前时间是否处于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:45:00