export function parseStoredDate(value: string) { const trimmed = value.trim(); const normalized = /^\d{4}-\d{2}-\d{2}$/.test(trimmed) ? `${trimmed}T00:00:00+08:00` : /^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?$/.test( trimmed, ) ? `${trimmed.replace(" ", "T")}Z` : trimmed; return new Date(normalized); } export function formatShanghaiDate( value: string | null | undefined, withTime = false, ) { if (!value) return "—"; const date = parseStoredDate(value); if (Number.isNaN(date.getTime())) return value; return new Intl.DateTimeFormat("zh-CN", { timeZone: "Asia/Shanghai", month: "2-digit", day: "2-digit", ...(withTime ? { hour: "2-digit", minute: "2-digit" } : {}), }).format(date); } export function formatShanghaiToday(value: Date | number = Date.now()) { const date = value instanceof Date ? value : new Date(value); const parts = new Intl.DateTimeFormat("zh-CN", { timeZone: "Asia/Shanghai", month: "numeric", day: "numeric", }).formatToParts(date); const calendar = Object.fromEntries( parts.map((part) => [part.type, part.value]), ); return `${calendar.month}月${calendar.day}日`; }