Files
yunzerwebsiteallinone/platform/src/utils/datetime.ts
T
2026-09-15 10:44:31 +08:00

56 lines
2.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 统一日期时间格式化工具(platform 端)
*
* 后端(Go)返回的时间字段为 RFC3339 / ISO 8601 字符串,
* 例如 "2026-03-31T23:34:07+08:00",直接渲染不友好。
* 页面上显示时间统一使用本工具,输出:
* formatDateTime / formatTime -> 2026-03-31 23:34:07(YYYY-MM-DD HH:mm:ss)
* formatDate / formatDateOnly -> 2026-03-31(YYYY-MM-DD)
*/
const pad = (n: number) => String(n).padStart(2, "0");
function toDate(value: any): Date | null {
if (value === null || value === undefined || value === "") return null;
if (value instanceof Date) return isNaN(value.getTime()) ? null : value;
// 兼容秒级 / 毫秒级时间戳
if (typeof value === "number") {
const d = new Date(value < 1e12 ? value * 1000 : value);
return isNaN(d.getTime()) ? null : d;
}
// "2026-03-31 23:34:07" 形式在部分浏览器解析异常,统一先替换为 ISO 形式
const str = String(value).trim().replace(" ", "T");
const d = new Date(str);
return isNaN(d.getTime()) ? null : d;
}
/** 2026-03-31 23:34:07(YYYY-MM-DD HH:mm:ss);非法值返回 "-" */
export function formatDateTime(value: any): string {
const d = toDate(value);
if (!d) return "-";
return (
`${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ` +
`${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`
);
}
/** 与 formatDateTime 相同(兼容旧调用名) */
export function formatTime(value: any): string {
return formatDateTime(value);
}
/** 2026-03-31(YYYY-MM-DD);非法值返回 "-";纯日期串不做时区换算 */
export function formatDate(value: any): string {
if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}$/.test(value.trim())) {
return value.trim();
}
const d = toDate(value);
if (!d) return "-";
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
}
/** 与 formatDate 相同(兼容旧调用名) */
export function formatDateOnly(value: any): string {
return formatDate(value);
}