时间格式化函数

发布于:2025-08-08 ⋅ 阅读:(12) ⋅ 点赞:(0)
type Language = 'zh' | 'en'

const i18nWeekdays: Record<Language, string[]> = {
  zh: ['日', '一', '二', '三', '四', '五', '六'],
  en: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
}

const i18nMonths: Record<Language, string[]> = {
  zh: ['01月', '02月', '03月', '04月', '05月', '06月', '07月', '08月', '09月', '10月', '11月', '12月'],
  en: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
}

export function formatTimeI18n(time: any, pattern = '{y}-{m}-{d} {h}:{i}', lang: Language = 'zh') {
  if (!time) return null

  let date: Date

  if (typeof time === 'object') {
    date = time
  } else {
    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
      time = parseInt(time)
    } else if (typeof time === 'string') {
      time = time
        .replace(/-/g, '/')
        .replace('T', ' ')
        .replace(/\.[\d]{3}/g, '')
    }
    if (typeof time === 'number' && time.toString().length === 10) {
      time *= 1000
    }
    date = new Date(time)
  }

  const formatObj: Record<string, any> = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay(), // 星期几:0 ~ 6
    M: i18nMonths[lang][date.getMonth()], // 月份名称
  }

  const timeStr = pattern.replace(/{(y|m|d|h|i|s|a|M)+}/g, (result, key) => {
    let value = formatObj[key]
    if (key === 'a') {
      return i18nWeekdays[lang][value]
    }
    if (key === 'm' || key === 'd' || key === 'h' || key === 'i' || key === 's') {
      return value < 10 ? `0${value}` : value
    }
    return value
  })

  return timeStr
}


formatTimeI18n(new Date(), '{y}-{m}-{d} {h}:{i} 星期{a}', 'zh')
// 输出:2025-08-05 15:10 星期二

formatTimeI18n(Date.now(), '{M} {d}, {y} ({a})', 'en')
// 输出:Aug 05, 2025 (Tue)

formatTimeI18n('2025-08-05T08:00:00Z', '{y}/{m}/{d} {h}:{i}', 'en')
// 输出:2025/08/05 16:00(根据时区)
参数名 类型 说明
time any 时间值(支持 Date、时间戳、时间字符串)
pattern string 可选,格式模板,默认 {y}-{m}-{d} {h}:{i}
模板符号 含义 示例值
{y} 2025
{m} 月(两位数字) 08
{M} 月(英文缩写) Aug / 八月
{d} 05
{h} 时(24小时) 14
{i} 分钟 30
{s} 05
{a} 星期几 一 / Mon

小结

  • 支持多种输入格式(时间戳、Date、字符串);

  • 自动适配 10位秒级时间戳;

  • 替换模板方式灵活,适用于多语言、本地化处理;

  • 在 Vue、React 等前端项目中常用于统一时间显示。


网站公告

今日签到

点亮在社区的每一天
去签到