From 8b83f9e1bd2550eb94a2dfc3dd314f72af4ff74d Mon Sep 17 00:00:00 2001 From: shy3130 <415333856@qq.com> Date: Thu, 6 Aug 2026 19:09:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(regime):=20=E4=BF=AE=E5=A4=8D=E6=97=A5?= =?UTF-8?q?=E5=8E=86=E7=83=AD=E5=8A=9B=E5=9B=BE=E4=BA=A4=E6=98=93=E6=97=A5?= =?UTF-8?q?=E9=94=99=E4=BD=8D=E5=88=B0=E5=91=A8=E6=9C=AB=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit calendarMonths 只在月初按 dow 算了前导空位, 之后把真实交易日逐个 push, 不按日期补齐缺失的天。当某月数据不是从 1 号连续到月末(最早月份只有 下半月数据或中间缺几天)时, 后续交易日格子整体左移, 被挤到周末列, 看起来像周六周日也有数据。 改为遍历该月每一个自然日: 交易日且有数据填 RegimeRow, 其余日子填 null, 每个格子都对齐到正确的周几列。月内数据不连续不再错位。 验证: pnpm build 通过。 --- frontend/src/pages/Regime.tsx | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/frontend/src/pages/Regime.tsx b/frontend/src/pages/Regime.tsx index 3ca67f1..3fe9e6e 100644 --- a/frontend/src/pages/Regime.tsx +++ b/frontend/src/pages/Regime.tsx @@ -327,12 +327,19 @@ export function Regime() { return [...byMonth.entries()].sort().map(([ym, monthRows]) => { const [y, m] = ym.split('-') const year = Number(y), month = Number(m) - // 该月第一天是周几(0=周日 → 转成周一为起始: 周一=0) - const firstDay = new Date(year, month - 1, 1) - let dow = firstDay.getDay() // 0=Sun..6=Sat - dow = dow === 0 ? 6 : dow - 1 // 转成 周一=0..周日=6 - const cells: (RegimeRow | null)[] = Array(dow).fill(null) - for (const r of monthRows) cells.push(r) + // 按自然日铺格子: 只有该日为交易日且有数据才填 RegimeRow, 其余日子填 null。 + // 这样每个格子都对其正确的周几列, 不会因月内数据不连续而把交易日错位到周末列。 + const dateToRow = new Map() + for (const r of monthRows) dateToRow.set(r.date, r) + // 月首的星期偏移(周一=0..周日=6), 与表头 ['一'..'日'] 列顺序一致 + const firstDow = new Date(year, month - 1, 1).getDay() + const leadOffset = firstDow === 0 ? 6 : firstDow - 1 + const cells: (RegimeRow | null)[] = Array(leadOffset).fill(null) + const dayCount = new Date(year, month, 0).getDate() + for (let day = 1; day <= dayCount; day++) { + const ds = `${y}-${m.padStart(2, '0')}-${String(day).padStart(2, '0')}` + cells.push(dateToRow.has(ds) ? dateToRow.get(ds)! : null) + } // 补齐到 7 的倍数(完整周) while (cells.length % 7 !== 0) cells.push(null) // 切成每周一组