31 lines
1.3 KiB
TypeScript
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 天即本月最后一天
|
|
});
|