如何将形如4d 5hours 8mins的时长转换为秒?(JS实现)
时长转秒的JS实现方案
针对你需要把各种格式的时长字符串转换成总秒数的需求,这里给你一个简单易懂的JS实现,适配你提到的各种单位写法(比如4d/4 days/4days都能处理):
核心思路
- 用正则表达式提取字符串里的数字+单位组合,不管数字和单位之间有没有空格
- 建立单位和秒数的映射表,把不同写法的同一单位统一对应到秒数
- 遍历所有提取到的内容,累加计算总秒数
完整代码
function durationToSeconds(input) { // 单位到秒数的映射,覆盖各种常见写法 const unitSecondsMap = { d: 86400, day: 86400, days: 86400, h: 3600, hour: 3600, hours: 3600, min: 60, mins: 60, minute: 60, minutes: 60 }; // 正则匹配:数字 + 可选空格 + 单位,忽略大小写 const durationRegex = /(\d+)\s*([a-z]+)/gi; let matchResult; let totalSeconds = 0; // 遍历所有匹配到的时长片段 while ((matchResult = durationRegex.exec(input)) !== null) { // 提取数字并转成整数 const amount = parseInt(matchResult[1], 10); // 单位转小写,避免大小写差异影响匹配 const unit = matchResult[2].toLowerCase(); // 如果是已知单位,就累加对应的秒数 if (unitSecondsMap[unit]) { totalSeconds += amount * unitSecondsMap[unit]; } else { // 遇到未知单位时给出提示(新手可以删掉这行,或者保留用来排错) console.warn(`没识别到单位:${unit},这部分时长会被忽略`); } } return totalSeconds; }
测试用例
你可以直接调用这个函数测试:
// 测试你给的例子 console.log(durationToSeconds("4d 5hours 8mins")); // 输出 364080 // 其他格式也能处理 console.log(durationToSeconds("2days 3h 10minutes")); // 输出 184200 console.log(durationToSeconds("1day2h30mins")); // 输出 95400
关键部分解释
- 正则表达式:
/(\d+)\s*([a-z]+)/gi专门用来抓取数字和单位的组合,\d+匹配数字,\s*允许数字和单位之间有0个或多个空格,[a-z]+匹配单位字母,g表示全局匹配所有片段,i表示忽略大小写(比如Hours和hours都能识别) - 单位映射表:把同一个时间单位的不同写法(比如
min/mins/minute)都对应到相同的秒数,避免重复判断 - 累加计算:每次匹配到一个片段,就把数字乘以对应单位的秒数,加到总秒数里
内容的提问来源于stack exchange,提问作者Joseph Duguay
相关产品推荐
相关产品推荐

