时长人性化指南:把毫秒和秒做时长转换成人话
把日志里的毫秒、视频时长、倒计时秒数,做一次时长人性化,变成天时分秒的人话。讲清逐级拆解的算法、短中长三种格式,以及多久之前的相对时间读法。
时长人性化:把一串秒数变成人会读的那句话
接口返回 90061,日志里写着 5400000 ms,倒计时变量是一个 604800。这些数字本身对人没有意义。把它们变成「1 天 1 小时 1 分 1 秒」「1 时 30 分」「7 天」,才是给人看的样子。这件事叫时长人性化,它不是单位换算,而是呈现:不产出一个小数,而是给出可读的多单位短语。
拆解算法:逐级除以 60、60、24
时长人性化的核心只是一串带余数的除法。假设手里是 90061 秒,从最小的单位往上推:
- 先对 60 取模,得到秒:90061 % 60 = 1 秒,商是 1501 分钟的总量。
- 这个商再对 60 取模,得到分:1501 % 60 = 1 分,商是 25 小时的总量。
- 再对 24 取模,得到小时:25 % 24 = 1 小时,商是 1 天。
- 剩下的就是天:1 天。
所以 90061 秒就是 1 天 1 小时 1 分 1 秒。整个过程没有任何魔法,就是「秒 → 60 → 分 → 60 → 时 → 24 → 天」一级一级把余数掏出来。如果输入是毫秒,只是在最前面多除一个 1000 拿到毫秒余数,后面完全一样。
真实输入输出:90061 这个数字
把 90061 当秒填进 时长人性化工具,输出是:
输入:90061 秒
短格式:1天1时1分1秒
长格式:1 天, 1 小时, 1 分钟, 1 秒
同一个 90061,如果当毫秒读,就只有约 90 秒,输出会变成 1 分 30 秒 61 毫秒。数字一模一样,单位让量级差了一千倍。这也是核对单位有没有选错的最快办法:切一下毫秒和秒的开关,看短语怎么变,比在脑子里除以 1000 靠谱。
短、中、长三种格式各管一处
同一个时长,放在不同位置需要不同的密度:
- 短格式
2天3时5分10秒,紧凑,塞进日志行、图表轴标签、状态徽章这种地方窄的位置最合适。 - 中等格式
2 天 3 小时 5 分 10 秒,带空格的单字单位,介于两者之间。 - 长格式
2 天, 3 小时, 5 分钟, 10 秒,读起来像一句话,适合通知、邮件、给非技术人看的文案。
三种格式都会丢掉为零的部分,所以一个干净的两小时值不会冒出空的分和秒。再配两个旋钮:最多单位数从大往小限制打印几组,一个一天出头的值设成 2 就得到 1天1时 停住;最小单位从下往上设地板,设成分就把秒和毫秒整段丢掉。前者收头部,后者砍尾部,别搞混。
相对时间:多久之前与还有多久
除了正向拆解,还有一个相对时间读法,拿同一个量级带上正负号的方向。负的差值读成「3 小时前」,正的读成「3 小时后」,不足一秒的统统收成「刚刚」。它只挑最大的那个非零单位,所以句子是「3 小时前」而不是「3 小时 12 分 4 秒前」,这才像信息流里该有的样子。
我自己最常用的就是这一块。我维护过一个帖子列表,卡片要显示「多久之前」。最早是手写一坨 if-else 判断秒、分、小时、天,边界处处是坑(59 秒该不该跳到 1 分钟,跨天怎么算)。后来改成:现在的毫秒减去存档时间戳,把这个差值丢进相对读法,直接拿到「3 小时前」。倒计时同理,用未来的截止时间减现在就行。一段逻辑覆盖了过去和未来两个方向,卡片上的措辞也和用户早已熟悉的那些应用对得上了。
一个常踩的坑:单位停在毫秒
最容易出错的地方,是数据本是秒却把单位停在了毫秒。一个本该是一小时的 3600,在毫秒模式下会打印成 3 秒 600 毫秒,差了整整一千倍。判断来源的经验是:JavaScript 的定时器、Date.now 差值、performance.now 多数是毫秒;Unix 时间戳、shell 的 time 输出通常是秒。信任那句人话之前,先确认来源、设好开关。
还要分清,人性化是呈现,不是算术。如果你要的是「90 分钟等于几小时」这种十进制答案 1.5,或者一个 ISO 8601 的时长串,那是另一类需求,请改用 时长换算工具 来做单位之间的数值换算。这个工具只负责把量级变成人会读的多单位短语。
把日志计时、视频长度、TTL、倒计时这些干巴巴的数字都过一遍时长人性化,该一眼看出慢的那条、该给用户一句好读的文案,都会顺很多。
Made by Toolora · Updated 2026-06-13