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

开发国际象棋时钟时,分钟转毫秒出现异常结果求助

问题排查:国际象棋时钟分钟显示为实际值100倍

问题描述

开发国际象棋时钟时,从DOM获取分秒数值后,经msToClockFormat函数转换,得到的分钟数是实际值的100倍。反复检查msToClockFormat的分钟计算逻辑(基于60000毫秒/分钟)未发现问题,寻求排查帮助。

问题根源

问题出在stringTimeToMs函数的类型处理上:

function stringTimeToMs(time) {
  let minutes = time.split(":")[0];
  let seconds = time.split(":")[1];
  return (minutes * 60 + seconds) * 1000;
}

split方法返回的是字符串类型,seconds未做类型转换直接参与运算时,会触发字符串拼接而非数值相加:

  • 以初始值"3:00"为例:minutes * 60得到数值180,加上字符串"00"后变成字符串"18000"
  • 再乘以1000,最终得到18000000毫秒,对应300分钟——正好是实际3分钟的100倍。

修复方案

将minutes和seconds转为数值类型后再计算,修改后的stringTimeToMs函数:

function stringTimeToMs(time) {
  let minutes = parseInt(time.split(":")[0], 10);
  let seconds = parseInt(time.split(":")[1], 10);
  return (minutes * 60 + seconds) * 1000;
}

也可以用Number()做类型转换:

function stringTimeToMs(time) {
  let minutes = Number(time.split(":")[0]);
  let seconds = Number(time.split(":")[1]);
  return (minutes * 60 + seconds) * 1000;
}

额外优化建议

原定时器setInterval(tick, 1)存在性能浪费:浏览器最小定时器间隔通常为4ms,且1ms间隔的计时逻辑不符合实际需求。建议改为1秒间隔,同时每次减去1000毫秒:

function tick() {
  if (!reset) {
    if (player1) {
      ms1 -= 1000;
      btn1.innerHTML = msToClockFormat(ms1);
    } else {
      ms2 -= 1000;
      btn2.innerHTML = msToClockFormat(ms2);
    }
  }
}

var myInterval = setInterval(tick, 1000);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:33:28