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 等前端项目中常用于统一时间显示。