feat(admin): 新增统一时间格式化 formatDateTime(YYYY-MM-DD HH:mm:ss)
This commit is contained in:
@@ -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}`
|
||||
}
|
||||
Reference in New Issue
Block a user