JavaScript 不使用Math.floor将总分钟数转换为天、小时、分钟
分钟转天/小时/分钟整数格式实现方案
问题背景
需要将接口获取到的总时长分钟值,转换为天:小时:分钟的整数格式,初始实现代码如下:
var duration = getControlValue('incident','incident_open_duration'); var formattedDuration = duration/24/60 + ":" + duration/60%24 + ':' + duration%60); alert(formattedDuration);
以上代码存在两个问题:
- 语法错误:拼接语句末尾多写了一个右括号
- 计算结果带小数:当总分钟数为8289.66时,返回结果为
5.756708333333333:18.161:9.659999999999854,不符合整数展示要求
尝试使用Math.floor做向下取整,但当前开发环境不支持该函数,需要兼容的替代实现。
替代取整方案
针对正数时长的取整场景,以下三种方式都可以实现和Math.floor一致的截断小数效果,兼容性远高于Math对象方法:
- 用
parseInt(数字, 10):自动截断小数部分返回整数,是适配性最高的方案,几乎所有JS运行环境都支持 - 用双按位非
~~数字:通过位运算隐式转整数,对正数向下取整,性能较好 - 用按位或0
数字 | 0:和双按位非逻辑一致,写法更简洁
修正后可运行代码
推荐使用parseInt方案,避免位运算在超大数字场景下的溢出问题,同时做分步计算减少累计误差:
var duration = getControlValue('incident','incident_open_duration'); var days = parseInt(duration / (24 * 60), 10); var leftAfterDays = duration - days * 24 * 60; var hours = parseInt(leftAfterDays / 60, 10); var minutes = parseInt(leftAfterDays - hours * 60, 10); // 如果需要单数字补前导零(比如显示为05:03:09)可以放开下面注释 // days = days < 10 ? '0' + days : days; // hours = hours < 10 ? '0' + hours : hours; // minutes = minutes < 10 ? '0' + minutes : minutes; var formattedDuration = days + ":" + hours + ":" + minutes; alert(formattedDuration);
传入8289.66测试时,返回结果为5:18:9,完全符合整数格式要求。
内容的提问来源于stack exchange,提问作者ns046
相关产品推荐
相关产品推荐

