真太阳时修正经验.md 2.3 KB

真太阳时修正经验(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