# 真太阳时修正经验(2025-12-16) ## 背景 - 新疆用户反馈:报告中“阳历先减2小时,真太阳时再减2小时”,四柱/神煞与对照工具不一致。 - 根因:出生时间先在调用方计算了一次真太阳时,然后 `BaziCalculator` 内部再次计算,形成“双重扣减”。 ## 现行策略(已上线) - **唯一修正点**:所有真太阳时只在 `BaziCalculator` 内部执行一次。 - **时间基线**:入口出生时间一律视为北京时间(Asia/Shanghai),用 `ensure_cn` 赋予时区后再做真太阳时修正。 - **计算时间**:核心与扩展模块全部基于 `calc_dt`(真太阳时或用户禁用时的原始北京时),保持一致性。 - **展示时间**:UI/进度/日志/队列/Help 统一用北京时间;报告字段 `trueSolarTime` 展示经度修正后的时间。 ## 涉及改动(要点) - `utils/timezone.py`: `now_cn/ensure_cn/fmt_cn` 固定 Asia/Shanghai。 - `bot.py`: 去掉外层 `calc_true_solar_time`;时间显示用 `fmt_cn(now_cn())`;队列时间戳用北京时间。 - `main.py`: API 不再预先修正;`trueSolarTime` 取自 `BaziCalculator` 内部结果。 - `bazi_calculator.py`: 新增 `use_true_solar_time`,统一 `calc_dt`;扩展模块/命卦/小运等改用 `calc_dt`;元数据时间用北京时间。 - `liuyao.py`, `qimen.py`, `system_optimization.py`: 时间戳统一北京时间。 - 文档:`AGENTS.md` 记录“时区统一 Asia/Shanghai”。 ## 抽象问题与防范 1. **时区假设不一致**:Naive datetime 若按本地解析会漂移;统一假设“输入即北京时”,先补时区再计算。 2. **重复校正**:真太阳时公式只允许出现一次;调用链上严禁二次修正。 3. **基准混用**:展示用北京时,计算用真太阳时(单次修正)。若新增模块,必须复用 `calc_dt`,不得自算。 ## 验证建议 - 用新疆样例(乌鲁木齐 87E,08:00)跑一次:阳历应保持 08:00,北京时显示 08:00,真太阳时约 05:4x,仅扣一次。 - 比对“测测”等对照工具的四柱/神煞,应一致。 ## 后续准则 - 如需对外提供 UTC/其他时区,先转为北京时,再按经度做真太阳时,仍然只修正一次。 - 新增集成模块时,禁止各自重复计算真太阳时;统一接受 `calc_dt`。