| 526 | // 见 https://wikipedia.org/wiki/ISO_week_date |
| 527 | // 中文说明 https://juejin.cn/post/6921245139855736846 |
| 528 | export const getISOWeek = (date: Date): number => { |
| 529 | // 使用传入日期的年月日创建 UTC 日期对象,忽略本地时间部分,避免时区影响 |
| 530 | const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); |
| 531 | |
| 532 | // 将日期调整到本周的星期四(ISO 8601 规定:周数以星期四所在周为准) |
| 533 | // 计算方式:当前日期 + 4 − 当前星期几(星期一 = 1,星期日 = 7) |
| 534 | d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7)); |
| 535 | |
| 536 | // 获取该星期四所在年份的第一天(UTC) |
| 537 | const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); |
| 538 | |
| 539 | // 计算从年初到该星期四的天数差 |
| 540 | // 再换算为周数,并向上取整,得到 ISO 周数 |
| 541 | return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7); |
| 542 | }; |
| 543 | |
| 544 | export function stripUndefined<T extends Record<string, unknown>, K = T | undefined>(obj: K | T): K | T { |
| 545 | if (!obj || typeof obj !== "object") return obj; |