JavaScript实现毫秒转秒/分/时/天格式时结果异常排查
问题原因
你的代码逻辑本身是基于「传入值为时间间隔毫秒数」做换算,但测试时传入的1653991056493是Unix时间戳(代表从1970年1月1日UTC零点累计到2022-05-31的总毫秒数,是一个绝对时间点标记,不是时间差),直接换算得到的19143.4天是1970年到该时间点的总天数,和你预期的2-3天结果不符。
另外代码存在小隐患:你提前用toFixed(1)把计算值转为字符串,依赖JS隐式类型转换做大小比较,边界值判断时可能出现精度导致的判断错误。
修复方案
如果要实现「传入目标时间点,自动返回距离当前时间多久之前」的效果,需要先计算当前时间和目标时间的毫秒差值,再做单位匹配换算,推荐实现如下:
function timeAgo(targetTimestamp) { // 计算时间差绝对值,兼容目标时间晚于当前时间的场景 const diffMs = Math.abs(Date.now() - targetTimestamp); // 单位配置:从小到大排列,配置进位阈值 const unitConfig = [ { interval: 1000, suffix: ' Sec', carry: 60 }, { interval: 1000 * 60, suffix: ' Min', carry: 60 }, { interval: 1000 * 60 * 60, suffix: ' Hrs', carry: 24 }, { interval: 1000 * 60 * 60 * 24, suffix: ' Days' } ]; for (const unit of unitConfig) { const value = diffMs / unit.interval; // 没有下一个更大单位,或者值未达到进位阈值时返回结果 if (!unit.carry || value < unit.carry) { return `${value.toFixed(1)}${unit.suffix}`; } } } // 测试:构造3天前的时间戳传入 const threeDaysAgo = Date.now() - 3 * 24 * 60 * 60 * 1000; console.log(timeAgo(threeDaysAgo)); // 输出 3.0 Days
如果你需要保留原函数「直接传入时间间隔毫秒值换算」的逻辑,只需要在调用时传入正确的间隔值即可,比如传入2天对应的毫秒数2 * 24 * 60 * 60 * 1000,就会返回2.0 Days。
内容的提问来源于stack exchange,提问作者Fathe
相关产品推荐
相关产品推荐

