Files
UI/packages/skin/ui/src/dateKit.ts
T
2026-10-26 14:08:58 +08:00

31 lines
1.3 KiB
TypeScript

/*** 日期工具:datePicker 与 calendar 共用一套格式化与网格语义,避免两处各写一遍 ***/
export const pad = (n: number): string => String(n).padStart(2, '0'); // 两位补零
/*** 拼成 YYYY-MM-DD ***/
export const fmt = (y: number, m: number, d: number): string => `${y}-${pad(m + 1)}-${pad(d)}`;
/*** 解析 YYYY-MM-DD:非法串返回 null,调用方自行回落 ***/
export const parse = (s: string): [number, number, number] | null => {
const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(s);
return m ? [Number(m[1]), Number(m[2]) - 1, Number(m[3])] : null;
};
/*** 今天 ***/
export const today = (): [number, number, number] => {
const d = new Date();
return [d.getFullYear(), d.getMonth(), d.getDate()];
};
/*** 按天偏移:跨月 / 跨年自动进位,非法输入回落到今天 ***/
export const shiftDay = (key: string, delta: number): string => {
const p = parse(key) ?? today();
const d = new Date(p[0], p[1], p[2] + delta);
return fmt(d.getFullYear(), d.getMonth(), d.getDate());
};
/*** 单月网格元数据:月初留白格数与当月天数 ***/
export const monthGrid = (y: number, m: number): { lead: number; total: number } => ({
lead: new Date(y, m, 1).getDay(), // 1 号是周几 → 前面留几个空位
total: new Date(y, m + 1, 0).getDate(), // 下月第 0 天即本月最后一天
});