• feat(calendar): 扩展先秦至秦汉古历支持

- 新增显式古历 API,支持先秦古历与秦汉颛顼历选择
- 将默认公农历转换范围扩展至 -721..3000
- 支持后九月解析、负年份干支日和古历法相符节气
- 补充秦汉、先秦、交接边界和节气回归测试
This commit is contained in:
2026-06-09 19:35:18 +08:00
parent c8dd777a7b
commit a8e7513683
9 changed files with 1985 additions and 52 deletions
+26 -1
View File
@@ -358,10 +358,35 @@ func innerParseLunar(lunar string) ([]time.Time, error) {
if err != nil {
return []time.Time{}, err
}
if date.houMonth && date.comment != "" {
return nil, fmt.Errorf("未找到对应日期")
}
if date.year != 0 && date.comment == "" {
if date.year < -103 || date.year > 3000 {
if date.year < ancientBoundaryMinYear || date.year > 3000 {
return nil, fmt.Errorf("年份超出范围")
}
if date.houMonth && (date.year < qinHanMinYear || date.year > qinHanMaxYear) {
return nil, fmt.Errorf("未找到对应日期")
}
if date.year < qinHanMinYear {
d, ok := lunarToSolarAncientDefault(date.year, date.month, date.day, date.leap)
if !ok {
return nil, fmt.Errorf("未找到对应日期")
}
return []time.Time{d.Solar()}, nil
}
if date.year <= qinHanMaxYear {
if date.year == qinHanMaxYear {
if d, ok := lunarToSolarHanQingDefault(date.year, date.month, date.day, date.leap); ok {
return []time.Time{d.Solar()}, nil
}
}
d, ok := rapidSolarQinHan(date.year, date.month, date.day, date.leap)
if !ok {
return nil, fmt.Errorf("未找到对应日期")
}
return []time.Time{d}, nil
}
if date.year <= 1912 {
d := rapidSolarHan2Qing(date.year, date.month, date.day, date.leap, yearDiffLunar(date.year, date.month, date.day), nil)
return []time.Time{d}, nil