如何用setTimeout定时获取下午2点、3点的BTC价格?
关于setTimeout定时到指定时间获取BTC价格的问题
核心问题解答
setTimeout的参数要求:
setTimeout的第二个参数必须是从当前时刻开始的延迟毫秒数,不是当天的绝对时间毫秒数。你直接把下午2点转为50400000毫秒的做法是错误的——这个数值代表从现在开始延迟14小时,只有当前是0点时才会在下午2点触发,其他时间都会产生偏差。你原代码的问题:嵌套
setTimeout里的50400000毫秒是14小时的延迟,这不是下午2点到3点的间隔(正确间隔应为3600000毫秒,即1小时),而且外层的54000000毫秒是15小时延迟,逻辑完全不符合“当天下午2点、3点触发”的需求。
简便且可靠的解决方案
正确的思路是:计算当前时间到目标时间(下午2点、3点)的时间差,将这个差值作为setTimeout的延迟参数。同时要处理“目标时间已过”的情况(比如当前已经是下午4点,就自动将定时设置到第二天的对应时间)。
步骤1:写一个工具函数计算延迟时间
这个函数可以帮你快速算出从现在到指定小时的延迟毫秒数:
function getDelayToTargetTime(targetHour, targetMinute = 0) { const now = new Date(); // 生成当天目标时间的Date对象 const target = new Date(now.getFullYear(), now.getMonth(), now.getDate(), targetHour, targetMinute); // 如果目标时间已经过去了,就把日期推到第二天 if (target < now) { target.setDate(target.getDate() + 1); } // 返回当前时间到目标时间的毫秒差 return target.getTime() - now.getTime(); }
步骤2:封装价格获取逻辑
把重复的价格更新代码抽成独立函数,避免冗余:
function updateBTCPrice(displayElement) { const price = parseFloat(stockObject.p).toFixed(2); displayElement.innerText = price; // 设置价格颜色 displayElement.style.color = !lastPrice || lastPrice === price ? 'black' : price > lastPrice ? '#AAFF00' : 'red'; lastPrice = price; stockObject = null; }
步骤3:设置定时任务
直接调用工具函数获取延迟,分别设置下午2点和3点的定时器:
function runTimers() { // 下午2点的定时任务 const delayTo2PM = getDelayToTargetTime(14); setTimeout(() => { updateBTCPrice(stockPriceElementsec2); }, delayTo2PM); // 下午3点的定时任务 const delayTo3PM = getDelayToTargetTime(15); setTimeout(() => { updateBTCPrice(stockPriceElementsec3); }, delayTo3PM); }
为什么这个方案更好
- 无需手动计算复杂的时间转换,避免出错
- 自动处理跨天情况(比如当天时间已过目标点,自动延期到第二天)
- 代码模块化,可读性和可维护性更高
内容的提问来源于stack exchange,提问作者elodie
相关产品推荐
相关产品推荐

