feat(admin): 新增统一时间格式化 formatDateTime(YYYY-MM-DD HH:mm:ss)

This commit is contained in:
2026-09-05 21:47:31 +08:00
parent 6a0eb8cf63
commit cabbb4be0b
2 changed files with 97 additions and 0 deletions
+45
View File
@@ -0,0 +1,45 @@
/**
* 后台统一时间展示:字符串「YYYY-MM-DD HH:mm:ss」。
* 兼容 Java/MySQL 常见形态:ISO 带 T / 带毫秒 / 纯数字秒或毫秒 / Date 实例。
*/
export function formatDateTime(value: unknown, fallback = '—'): string {
if (value == null || value === '') return fallback
if (value instanceof Date) {
if (Number.isNaN(value.getTime())) return fallback
return padDate(value)
}
const raw = String(value).trim()
if (!raw) return fallback
// 已是目标格式
if (/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(raw)) return raw
const match = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{1,2}):(\d{2})(?::(\d{2}))?/.exec(raw)
if (match) {
const [, y, mo, d, h, mi, s] = match
return `${y}-${mo}-${d} ${pad(h)}:${mi}:${s ?? '00'}`
}
const dateOnly = /^(\d{4})-(\d{2})-(\d{2})$/.exec(raw)
if (dateOnly) return `${dateOnly[1]}-${dateOnly[2]}-${dateOnly[3]} 00:00:00`
if (/^\d+$/.test(raw)) {
const num = Number(raw)
const ms = num > 1e11 ? num : num * 1000
const d = new Date(ms)
if (!Number.isNaN(d.getTime())) return padDate(d)
}
const parsed = new Date(raw)
if (!Number.isNaN(parsed.getTime())) return padDate(parsed)
return fallback
}
function pad(n: string | number): string {
return String(n).padStart(2, '0')
}
function padDate(d: Date): string {
const y = d.getFullYear()
const mo = pad(d.getMonth() + 1)
const day = pad(d.getDate())
const h = pad(d.getHours())
const mi = pad(d.getMinutes())
const s = pad(d.getSeconds())
return `${y}-${mo}-${day} ${h}:${mi}:${s}`
}