v3.6.2 同步发版:晚子时不再双重换日、港澳时区归位

- 晚子时(真太阳时 23:00–24:00,约 4% 的盘)修正:换日改由 tyme4py provider 原生实现(cast 新增 sect 参数,1=子初 / 2=子正),排盘层不再自行预滚日。3.6.1 及此前会滚两次,日柱多进一天、时柱随之错干——锚点 1973-08-23 23:32 男:旧 癸巳日壬子时 → 正 壬辰日庚子时。已排过的晚子时盘建议重排核对
- --day-boundary 子正 现真正生效(走 sect=2,晚子时日柱算当天),此前只改审计文案不改实际排盘
- data/cities.json 港澳 28 个条目由 Asia/Shanghai 改为 Asia/Hong_Kong(19)、Asia/Macau(9):大陆 1986–1991 行夏令时而港澳 1979 年后无,沿用上海区会把大陆夏令时错加到港澳命主身上
- 修副本环境 `pytest tests/` 收集期中断(test_sync_tool 模块级加载外层 tools/,skipif 挡不住导入),现按设计整模块 skip
- .gitignore 新增 data/.license.json、data/.update_check.json,本机授权与更新缓存不再可能误入仓
- 测试 178 项全绿(副本内 sync 工具 4 项按设计 skip);manifest 1278 文件,ed25519 签名,公钥指纹 3089bc1cc9a453e5…
This commit is contained in:
2026-10-12 19:05:09 +08:00
parent 415cb472b1
commit b20fd5c3c9
14 changed files with 175 additions and 72 deletions
+37
View File
@@ -17,6 +17,9 @@ SCRIPTS_DIR = SKILL_ROOT / "scripts"
GOLDEN_DIR = Path(__file__).resolve().parent / "golden"
if str(SCRIPTS_DIR) not in sys.path:
sys.path.insert(0, str(SCRIPTS_DIR))
_VENDOR = SKILL_ROOT / "vendor"
if str(_VENDOR) not in sys.path:
sys.path.insert(0, str(_VENDOR))
from astro.day_boundary import resolve_calendar_day # noqa: E402
from astro.solar_time import to_true_solar_time # noqa: E402
@@ -65,5 +68,39 @@ class LateZiGoldenTest(unittest.TestCase):
self.assertIs(flag["is_late_zi"], s["expect"]["is_late_zi"])
class LateZiSectPillarsTest(unittest.TestCase):
"""晚子时双滚回归:换日由 tyme4py provider 口径实现(sect 参数),
调用方不再预滚日。锚点:1973-08-23 23:32 真太阳时。
子初 → 壬辰日庚子时(滚一日);子正 → 辛卯日庚子时(不滚,晚子时时柱仍次日起)。
"""
def test_sect1_rolls_once(self):
from chart.tyme_adapter import cast
r = cast(datetime(1973, 8, 23, 23, 32), "男", sect=1)
self.assertEqual(r["day"]["gan"] + r["day"]["zhi"], "壬辰")
self.assertEqual(r["hour"]["gan"] + r["hour"]["zhi"], "庚子")
def test_sect2_no_roll(self):
from chart.tyme_adapter import cast
r = cast(datetime(1973, 8, 23, 23, 32), "男", sect=2)
self.assertEqual(r["day"]["gan"] + r["day"]["zhi"], "辛卯")
self.assertEqual(r["hour"]["gan"] + r["hour"]["zhi"], "庚子")
def test_provider_restored(self):
from chart.tyme_adapter import cast
from tyme4py.eightchar.provider.impl import DefaultEightCharProvider
from tyme4py.lunar import LunarHour
cast(datetime(1973, 8, 23, 23, 32), "男", sect=2)
self.assertIsInstance(LunarHour.provider, DefaultEightCharProvider)
def test_non_late_zi_unaffected(self):
from chart.tyme_adapter import cast
for sect in (1, 2):
with self.subTest(sect=sect):
r = cast(datetime(1973, 8, 23, 12, 0), "男", sect=sect)
self.assertEqual(r["day"]["gan"] + r["day"]["zhi"], "辛卯")
self.assertEqual(r["hour"]["gan"] + r["hour"]["zhi"], "甲午")
if __name__ == "__main__":
unittest.main()