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

适配JS倒计时计时器实现随促销时间递减显示剩余商品数量

问题核心错误

你的计算逻辑有2个根本性错误,直接导致比例计算完全失准:

  • 分母取值完全错误:countDownDate是促销截止时刻的绝对时间戳(从1970年1月1日0点到截止时刻的总毫秒数,数值是五十多年的毫秒总量),根本不是促销活动的总时长。你拿几小时/几天的剩余时长去跟五十多年的总毫秒数做除法,得到的比例自然完全不符合预期,你后面额外乘10000本质是凑数,根本解决不了逻辑问题。
  • 缺少促销开始时间定义:要做线性递减,必须先明确促销的总时长,也就是「促销截止时间 - 促销开始时间」,你只定义了截止时间,根本拿不到计算比例需要的总时长基准。
正确计算逻辑

线性递减的核心比例公式应该是:

剩余库存占比 = 活动剩余时长 / 活动总时长
活动刚开始时剩余时长等于总时长,占比为1,剩余库存等于初始值;活动结束时剩余时长为0,占比为0,剩余库存为0,完全符合你要的线性递减效果。

修正后代码
<script>
// 配置项
const initStock = 1000; // 初始可售库存
const promotionDuration = 4 * 24 * 60 * 60 * 1000; // 促销总时长,这里是4天对应的毫秒数
const countDownDate = new Date("Jul 01, 2022 20:59:59").getTime(); // 促销截止时间
const promotionStartDate = countDownDate - promotionDuration; // 自动计算促销开始时间

// 每秒更新一次
const timer = setInterval(function() {
  const now = new Date().getTime();
  const distance = countDownDate - now;
  let stockLeft;

  // 边界判断
  if (now < promotionStartDate) {
    // 活动还没开始,库存为初始值
    stockLeft = initStock;
  } else if (distance < 0) {
    // 活动结束,售罄
    clearInterval(timer);
    document.getElementById("timer").innerHTML = "SOLD OUT";
    stockLeft = 0;
  } else {
    // 正常计算剩余库存,向下取整避免出现小数
    const remainPercent = distance / promotionDuration;
    stockLeft = Math.floor(initStock * remainPercent);
  }

  // 页面渲染
  document.getElementById("available").innerHTML = initStock;
  document.getElementById("distance").innerHTML = distance;
  document.getElementById("now").innerHTML = now;
  document.getElementById("countDownDate").innerHTML = countDownDate;
  document.getElementById("numbLeft").innerHTML = stockLeft;
}, 1000);
</script>
额外说明
  • 如果你不需要处理「活动未开始」的场景,直接把promotionStartDate换成你实际的活动开始时间即可,不需要通过总时长倒推。
  • 库存取整可以根据需求换Math.round(四舍五入)或者保留指定位数小数,结合业务要求调整即可。

内容的提问来源于stack exchange,提问作者webguy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:21:19