fix(regime): 修复日历热力图交易日错位到周末列

calendarMonths 只在月初按 dow 算了前导空位, 之后把真实交易日逐个 push,
不按日期补齐缺失的天。当某月数据不是从 1 号连续到月末(最早月份只有
下半月数据或中间缺几天)时, 后续交易日格子整体左移, 被挤到周末列,
看起来像周六周日也有数据。

改为遍历该月每一个自然日: 交易日且有数据填 RegimeRow, 其余日子填 null,
每个格子都对齐到正确的周几列。月内数据不连续不再错位。

验证: pnpm build 通过。
This commit is contained in:
shy3130
2026-08-06 19:12:04 +08:00
parent c278dd3b02
commit 8b83f9e1bd
+13 -6
View File
@@ -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<string, RegimeRow>()
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)
// 切成每周一组