Skip to content
On this page

formatDurationTime持续时间

Hidden Title

基础用法:formatDurationTime(1162821)

基础用法

说明

formatDurationTime 用于把毫秒级持续时间格式化成中文时长文本,例如 1162821 会展示为分钟和秒。它会根据模板和数值自动省略前面为 0 的较大单位。

调用形式

ts
formatDurationTime(timestamp)
formatDurationTime(timestamp, format)
formatDurationTime(timestamp)
formatDurationTime(timestamp, format)

参数说明

参数类型必填默认值说明
timestampnumber-持续时间,单位是毫秒。
formatstring'{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')
  })
}

思云博智私有前端组件库