Appearance
formatDurationTime持续时间
Hidden Title
基础用法:
formatDurationTime(1162821)基础用法
说明
formatDurationTime 用于把毫秒级持续时间格式化成中文时长文本,例如 1162821 会展示为分钟和秒。它会根据模板和数值自动省略前面为 0 的较大单位。
调用形式
ts
formatDurationTime(timestamp)
formatDurationTime(timestamp, format)formatDurationTime(timestamp)
formatDurationTime(timestamp, format)参数说明
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
timestamp | number | 是 | - | 持续时间,单位是毫秒。 |
format | string | 否 | '{d}天{h}时{i}分{s}秒' | 输出模板。支持 {d} 天、{h} 小时、{i} 分钟、{s} 秒。 |
返回值
返回格式化后的字符串。当前面单位为 0 时,会从第一个非零单位开始展示;如果全为 0,会按模板中可用的最小单位显示 00。
常用场景
ts
formatDurationTime(1162821)
// '19分22秒'
formatDurationTime(5 * 60 * 1000, '{i}分{s}秒')
// '05分00秒'
formatDurationTime(999999999, '{d}天{h}时{i}分{s}秒')
// '11天13时46分39秒'formatDurationTime(1162821)
// '19分22秒'
formatDurationTime(5 * 60 * 1000, '{i}分{s}秒')
// '05分00秒'
formatDurationTime(999999999, '{d}天{h}时{i}分{s}秒')
// '11天13时46分39秒'注意事项
入参单位是毫秒,不是秒。模板中不写 {d} 时不会按天拆分,较长时间会继续累计到小时里。
函数源码
formatDurationTime
来源:packages/utils/src/format.ts
/**
* 将持续时间时间戳格式化为“天 / 时 / 分 / 秒”文本。
*
* @param timestamp 持续时间,单位毫秒。
* @param cFormat 输出模板,默认 `{d}天{h}时{i}分{s}秒`。
* @returns 格式化后的持续时间文本。
*
* @example
* formatDurationTime(1162821)
* // => '19分24秒'
*
* @example
* formatDurationTime(5 * 60 * 1000, '{i}分{s}秒')
* // => '05分00秒'
*/
export function formatDurationTime(timestamp: number, cFormat = '{d}天{h}时{i}分{s}秒'): string {
const secondsPerMinute = 60
const minutesPerHour = 60
const hoursPerDay = 24
let totalSeconds = Math.floor(timestamp / 1000)
let days = 0
if (cFormat.indexOf('d') !== -1) {
days = Math.floor(totalSeconds / (secondsPerMinute * minutesPerHour * hoursPerDay))
totalSeconds %= secondsPerMinute * minutesPerHour * hoursPerDay
}
const hours = Math.floor(totalSeconds / (secondsPerMinute * minutesPerHour))
totalSeconds %= secondsPerMinute * minutesPerHour
const minutes = Math.floor(totalSeconds / secondsPerMinute)
const seconds = totalSeconds % secondsPerMinute
const formatObj = {
d: days,
h: hours,
i: minutes,
s: seconds,
}
let parseFormat = cFormat
if (days === 0) {
parseFormat = cFormat.match(/{h}.*/g)?.[0] ?? ''
if (hours === 0) {
parseFormat = cFormat.match(/{i}.*/g)?.[0] ?? ''
if (minutes === 0) {
parseFormat = cFormat.match(/{s}.*/g)?.[0] ?? ''
}
}
}
return parseFormat.replace(/{(y|m|d|h|i|s)+}/g, (result, key) => {
let value = formatObj[key as keyof typeof formatObj]
if (result.length > 0 && value < 10 && value !== 0) {
return `0${value}`
}
return String(value || '00')
})
}