Node.js定时任务异常:非指定EST时段仍执行API请求问题排查
Node.js定时任务时段判断错误排查与修复
问题概述
Node.js服务器运行定时任务,计划在EST时间凌晨4点至9点半(盘前交易时段)每25秒从API拉取数据,但当前非指定时段仍会触发API查询,且错误打印“Time between specified ranges”。
核心错误点
1. 时间检查函数未定义now变量
checkTime函数中直接使用了now.toLocaleString(),但未提前定义now变量。这会导致estNow成为无效的Date对象,进而让estHour/estMinute获取到错误值(比如NaN),最终导致条件判断逻辑混乱,错误返回true。
2. 时段判断逻辑冗余且存在逻辑偏差
原条件(estHour >= 4 && estHour <= 9) || estHour === 9 && estMinute <= 30存在两个问题:
estHour <=9已经包含了9点整到9点59分的所有时间,后续的|| estHour ===9 && estMinute <=30完全冗余;- 正确的时段应该是4点到9点(不含9点),或者9点整到9点30分,原条件会错误包含9点30分之后的时间。
3. 假日判断变量赋值语法错误
main函数中var isMarketHoliday();是错误语法:这是尝试调用函数但未将结果赋值给变量,导致isMarketHoliday始终为undefined,!isMarketHoliday会被解析为true,完全失去假日判断的作用。
修复后的代码
修正后的checkTime函数
function checkTime() { const now = new Date(); // 补充定义当前时间变量 const estNow = new Date(now.toLocaleString("en-US", {timeZone: "America/New_York"})); const estHour = estNow.getHours(); const estMinute = estNow.getMinutes(); // 正确的时段判断逻辑 if ((estHour >= 4 && estHour < 9) || (estHour === 9 && estMinute <= 30)) { console.log('Time between specified ranges'); return true; } console.log('Not between 4 am and 9:30 am EST'); return false; }
修正后的main函数
async function main() { const startTime = Date.now(); const timeRight = checkTime(); // 正确调用假日判断函数并赋值(假设isMarketHoliday是返回布尔值的函数) const isMarketHoliday = isMarketHoliday(); if (timeRight && !isMarketHoliday) { try { // 执行API请求逻辑 // await yourApiCall(); } catch (error) { console.error(error); } } const endTime = Date.now(); console.log(`Function took: ${endTime - startTime} ms`); }
定时调用代码(无修改)
setInterval(main, 25000); // 每25秒执行一次main函数
额外提示
- 若需更可靠的时区处理,可考虑使用
luxon等专业日期库,避免原生toLocaleString在某些环境下的兼容性问题; - 确保
isMarketHoliday函数能正确返回布尔值,否则假日判断逻辑会失效。
内容的提问来源于stack exchange,提问作者ADSquared
相关产品推荐
相关产品推荐

