开发国际象棋时钟时,分钟转毫秒出现异常结果求助
问题排查:国际象棋时钟分钟显示为实际值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
相关产品推荐
相关产品推荐

