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

如何用setTimeout定时获取下午2点、3点的BTC价格?

关于setTimeout定时到指定时间获取BTC价格的问题

核心问题解答

  1. setTimeout的参数要求:setTimeout的第二个参数必须是从当前时刻开始的延迟毫秒数,不是当天的绝对时间毫秒数。你直接把下午2点转为50400000毫秒的做法是错误的——这个数值代表从现在开始延迟14小时,只有当前是0点时才会在下午2点触发,其他时间都会产生偏差。

  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:01:38