JavaScript中如何对HH:MM:SS格式时分秒时间求和并格式化输出
问题原因
你的代码运行结果出现小数、格式不符是两个问题导致的:
- 进位计算时没有取整:你代码里计算
hour = hour + minute/60、minute = minute + second/60时直接保留了除法的小数结果,比如你测试用例里所有分钟累加后是84,84/60=1.4,直接加到小时上就会让小时变成8.4;秒累加后是11,11/60≈0.1833,加到分钟上就让分钟变成24.1833 - 输出没有补前导零:即使数值是8,也需要转成两位的
08才能符合你要的HH:MM:SS格式
修复后的实现方案
建议封装成通用的时间累加函数,支持传入任意个HH:MM:SS格式的时间字符串,逻辑更简洁也不容易出错:
// 通用时间累加函数 function addTimes(...timeList) { let totalSeconds = 0; // 把所有时间统一转成秒数累加,避免多次进位出错 timeList.forEach(timeStr => { const [h, m, s] = timeStr.split(':').map(Number); totalSeconds += h * 3600 + m * 60 + s; }); // 总秒数转回时分秒 const hours = Math.floor(totalSeconds / 3600); totalSeconds %= 3600; const minutes = Math.floor(totalSeconds / 60); const seconds = totalSeconds % 60; // 补前导零保证两位格式 const pad = num => String(num).padStart(2, '0'); return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`; } // 你的测试用例 const time1 = "01:00:01"; const time2 = "01:00:10"; const time3 = "01:54:00"; const time4 = "01:30:00"; const time5 = "01:00:00"; const time6 = "01:00:00"; const time7 = "01:00:00"; console.log(addTimes(time1, time2, time3, time4, time5, time6, time7)); // 输出 08:24:11
实现思路说明
- 统一转总秒数累加的逻辑比分别累加时分再多次处理进位更简单,出问题的概率更低
- 用
Math.floor对除法结果向下取整,完全避免小数问题 - 用
padStart方法补前导零,保证输出格式严格符合两位的HH:MM:SS要求 - 封装成通用函数后,不管是加2个还是多个时间都可以直接调用,不用重复写拆分逻辑
内容的提问来源于stack exchange,提问作者Break Inside
相关产品推荐
相关产品推荐

