You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带多别名时间单位的自然语言时间字符串转换为毫秒?

非标准时间字符串转毫秒实现方案

目前没有浏览器或Node.js内置的API可以直接处理这类带自定义多别名单位的人类可读时间字符串,两类成熟的实现方案如下:

方案1:使用第三方成熟库(推荐生产环境使用)

专门用于解析人类可读时间字符串的parse-duration库已经默认覆盖了所有常见单位别名,无需自己处理单位映射规则,使用方式如下:

  1. 安装依赖:
    npm install parse-duration
  2. 调用解析:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:09:03