原生JS不依赖第三方库判断指定时区当前时间是否在工作时段
问题说明
需要在不引入momentJS等外部时间库的前提下,判断当前时间是否处于业务代表的工作时段内,代码需要支持在不同AWS区域部署时正常运行,不受部署节点本地时区影响。
现有已实现代码
localTimeZone = 'America/New_York'; localWorkingHours = [ {day: 'Sunday', from: '08:00', to: '14:00'}, {day: 'Sunday', from: '23:00', to: '23:59'}, {day: 'Monday', from: '00:00', to: '07:00'}, {day: 'Tuesday', from: '08:00', to: '16:00'}, {day: 'Wednesday', from: '08:00', to: '16:00'} ]; const now = new Date(); const currentDayInWeek = now.toLocaleString("en-US", { timeZone: localTimeZone, weekday: 'long' }); const workingTimes = localWorkingHours.filter(times => times.day === currentDayInWeek); // 待实现:校验当前时间是否落在当日工作时段区间内
实现方案
不用引入任何第三方库,直接用JS原生的Intl能力就能实现,核心是所有时间解析都显式指定目标时区,彻底绕开运行环境的本地时区影响,把时间统一转成当日0点开始的累计分钟数做数值比较即可,跨AWS区域运行完全不会出问题。
完整实现代码
// 工具方法:将HH:MM格式的时间转为当日0点起的累计分钟数 const convertTimeToMinutes = (timeStr) => { const [hour, minute] = timeStr.split(':').map(Number); return hour * 60 + minute; }; // 显式指定目标时区,获取当前时区下的24小时制时、分值 const [currentHour, currentMinute] = now.toLocaleString("en-US", { timeZone: localTimeZone, hour: '2-digit', minute: '2-digit', hour12: false // 强制关闭12小时制,避免AM/PM导致解析错误 }).split(':').map(Number); const currentTotalMinutes = currentHour * 60 + currentMinute; // 只要匹配任意一个当日工作时段,即处于工作时间 const isInWorkingHours = workingTimes.some(period => { const startMinutes = convertTimeToMinutes(period.from); const endMinutes = convertTimeToMinutes(period.to); return currentTotalMinutes >= startMinutes && currentTotalMinutes <= endMinutes; });
注意事项
- 禁止使用
getHours()、getMinutes()等直接获取Date对象时间分量的方法,这类方法返回的是运行环境本地时区的时间,跨区域部署会出现判断错误 - 配置工作时段时如果涉及跨天区间,统一拆分到两个日期的配置项中即可(比如周日23点到周一7点拆成周日23:00-23:59、周一00:00-07:00),不需要额外写跨天判断逻辑
- 传入的时区参数必须是标准IANA时区名称,不要传时区缩写(比如不要传EST,要传
America/New_York),避免时区解析歧义 - 该方案依赖JS标准内置API,所有Node.js LTS版本均原生支持,无额外兼容问题
内容的提问来源于stack exchange,提问作者user2503775
相关产品推荐
相关产品推荐

