如何将带多别名时间单位的自然语言时间字符串转换为毫秒?
非标准时间字符串转毫秒实现方案
目前没有浏览器或Node.js内置的API可以直接处理这类带自定义多别名单位的人类可读时间字符串,两类成熟的实现方案如下:
方案1:使用第三方成熟库(推荐生产环境使用)
专门用于解析人类可读时间字符串的parse-duration库已经默认覆盖了所有常见单位别名,无需自己处理单位映射规则,使用方式如下:
- 安装依赖:
npm install parse-duration - 调用解析:
import parse from 'parse-duration' const timeStr = '1 Day 10 Hours 10 Minutes 13 Seconds' const resultMs = parse(timeStr) // 输出结果为 124213000,和预期计算结果一致
该库原生支持的单位别名包含你提到的所有场景:小时支持H/Hr/Hrs/Hour/Hours,天支持D/Day/Days,分钟支持M/Min/Mins/Minute/Minutes,秒支持S/Sec/Secs/Second/Seconds,自动忽略大小写和空格。
方案2:手动实现轻量解析逻辑(无依赖场景)
如果不需要引入第三方依赖,可以自行通过正则匹配+单位映射表实现,代码如下:
- 首先定义单位和毫秒的映射表,可自由扩展别名:
const unitMsMap = { // 天相关别名 d: 86400000, day: 86400000, days: 86400000, // 小时相关别名 h: 3600000, hr: 3600000, hrs: 3600000, hour: 3600000, hours: 3600000, // 分钟相关别名 m: 60000, min: 60000, mins: 60000, minute: 60000, minutes: 60000, // 秒相关别名 s: 1000, sec: 1000, secs: 1000, second: 1000, seconds: 1000 }
- 实现解析函数:
function parseCustomTimeToMs(timeStr) { const matchReg = /(\d+)\s*([a-z]+)/gi let totalMs = 0 let matchItem while ((matchItem = matchReg.exec(timeStr)) !== null) { const num = Number(matchItem[1]) const unit = matchItem[2].toLowerCase() if (unitMsMap[unit]) { totalMs += num * unitMsMap[unit] } } return totalMs } // 测试用例 console.log(parseCustomTimeToMs('1 Day 10 Hours 10 Minutes 13 Seconds')) // 124213000 console.log(parseCustomTimeToMs('2 Hr 30 Min 5 Sec')) // 9005000
该实现无需额外依赖,可根据业务需求自由扩展更多单位(比如周、毫秒等)的别名规则。
内容的提问来源于stack exchange,提问作者Akhil A
相关产品推荐
相关产品推荐

