Vercel开源的ms,一行代码搞定所有时间单位换算

写代码时处理时间换算,是件不大不小的麻烦事。setTimeout 要毫秒,界面显示要"3天前",日志里要输出"已运行10小时"。毫秒、秒、分钟、小时之间来回倒,每次都得在心里默算,或者写个小工具函数。

Vercel 开源的 ms 就是专干这个的。5500 多 Star,npm 周下载量超 2000 万次,属于那种项目里大概率已经装了但你不知道的库。

正文顶部截图

一句话讲清楚

ms 是一个双向的时间格式转换器。把人类能读的时间字符串转成毫秒数,反过来也行。

ms('2 days')   // 172800000
ms('1d')       // 86400000
ms('2.5 hrs')  // 9000000
ms('1m')       // 60000

毫秒数转回可读字符串:

ms(60000)             // "1m"
ms(2 * 60000)         // "2m"
ms(-3 * 60000)        // "-3m"

加 long 参数输出完整写法:

ms(60000, { long: true })             // "1 minute"
ms(2 * 60000, { long: true })         // "2 minutes"

支持的输入格式比较全。year、month、week、day、hour、minute、second、millisecond 都覆盖了,每种还有缩写变体。years / year / yrs / yr / y 全认,大小写不敏感,“2 Minutes” 和 “2minutes” 都能解析。小数也行,0.5m 这种写法没问题。

README区域截图

为什么项目里大概率已经有了

ms 是 Next.js 的依赖之一。如果你用 Next.js 开发,ms 已经在你的 node_modules 里了。被 Vercel 用在自己的产品线上,可靠性不需要额外验证。

v3.0 版本引入了 TypeScript 类型支持。用模板字面量类型对输入字符串做校验,格式不对编译时就报错。还有 parseStrict 函数,对参数做更严格的检查。

Edge Runtime 兼容是另一个特点。能在 Vercel Edge Functions 这类轻量环境运行,包体积几百字节,对加载速度的影响很小。

实际使用

API 设计偏简洁。核心就是字符串转毫秒、毫秒转字符串。v3.0 把 parse 和 format 拆出来,按需引入,支持 tree shaking。

有几个点需要注意。ms 默认把纯数字当毫秒处理,传 ms(‘100’) 返回 100 而不是报错,这可能是预期行为也可能不是。月份按 30 天算,年份按 365 天算,这些约定值和真实日历有差异。需要精确日期计算的场景,建议用专门的日期库。

适合谁

写 Node.js 后端的,处理超时、缓存过期、定时任务时,ms 能省不少代码。Next.js 开发者不用说,已经装好了。写 CLI 工具的,用它解析 timeout 30s 这种参数也很省事。

如果你在做日历、账单这种需要精确日期运算的项目,ms 的精度不够,它不是干这个的。但如果你只是想把"2天"转成毫秒传给 setTimeout,或者把 3600000 转成"1h"显示在页面上,ms 刚好够用。

五百多行代码,解决了一个高频问题。功能边界清晰,没有多余的东西。

0 转成"1h"显示在页面上,ms 刚好够用。

五百多行代码,解决了一个高频问题。功能边界清晰,没有多余的东西。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐