const endAt = Date.now() + parseInt(res.remaining, 10) * 1000;
const timer = setInterval(() => {
if (Date.now() >= endAt) { clearInterval(timer); disableCta(); }
}, 1000);
活动还剩十分钟,部分用户手机上显示已结束,按钮变灰,换一台手机又正常,客服查了半天找不到原因。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,前端拿本地时间减服务端给的时间戳,用户手动改过时钟或时区偏移,差值直接算错。页面缓存又把结束时间冻在生成那一刻。
「限时标签时间不一致」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
处理上按这个顺序:服务端返回剩余秒数而不是绝对时间,前端只做倒计时递减;页面缓存时把这块做成动态片段,别整页缓存;剩余时间小于零再判结束,别用本地时间直接比较。
改完只确认一件事:把手机时间调快十分钟再打开页面,倒计时仍按服务端剩余时间走,不会提前结束。
