40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
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}日`;
|
|
}
|