import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import timezone from 'dayjs/plugin/timezone'; dayjs.extend(utc); dayjs.extend(timezone); /** * 将后端返回的 ISO 时间字符串格式化为本地可读格式。 * 兼容带时区(如 2026-06-22T15:51:26+00:00 / 2026-06-22T15:51:26Z)与 * 不带时区后缀的 UTC 时间字符串(如 2026-06-22T15:51:26 / 2026-06-22 15:51:26), * 自动转为本地时区并格式化为 "YYYY-MM-DD HH:mm:ss"。 */ function normalizeUtcDateStr(val: string): string { let raw = val.trim(); if (/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:\.\d+)?$/.test(raw)) { raw = raw.replace(' ', 'T') + 'Z'; } return raw; } export function formatTime(val: string | null | undefined): string { if (!val) return '-'; const d = dayjs(normalizeUtcDateStr(val)); return d.isValid() ? d.format('YYYY-MM-DD HH:mm:ss') : val; } /** * 简短格式,仅显示月-日 时:分 */ export function formatTimeShort(val: string | null | undefined): string { if (!val) return '-'; const d = dayjs(normalizeUtcDateStr(val)); return d.isValid() ? d.format('MM-DD HH:mm') : val; } /** * 斗鱼给的**秒级时间戳** → 可读文本。 * * ⚠️ `0` / `null` / 负数 一律显示 `-`:斗鱼用 0 表示「没有这个时间」, * 而 `new Date(0)` 是 **1970/1/1** —— 直接格式化会让运营以为 * "到期时间是 1970 年"(这个 bug 真出现过)。 */ export function formatUnixSeconds(val: number | string | null | undefined): string { if (val === null || val === undefined || val === '') return '-'; const seconds = typeof val === 'number' ? val : Number(val); if (!Number.isFinite(seconds) || seconds <= 0) return '-'; return formatTime(new Date(seconds * 1000).toISOString()); }