Files
astro/calendar/chineseLiaoJinYuan.go
T
b612 2bf8478639 feat: 完善日月食与月掩几何链路并扩展历法接口
- 新增日月食中心带、偏食带、阴影足迹、等时线、食分线及升落边界计算,支持极区与混合食拓扑
- 新增日食单时刻阴影求解器、站心状态查询、批量采样和 ΔT 覆盖接口
- 重构恒星与行星月掩路径,补充有限盘面接触、站心修正、掩带宽度、极区投影及升落边界
- 扩展 SVG 与 GeoJSON 输出,支持详细面板、全球/极区/地球投影、边界闭合、时间标记和拓扑签名
- 扩展日月食候选搜索、局地搜索、沙罗序列预计算与范围外推,补充系列锚点和成员一致性校验
- 补齐古历纪年、儒略历独有闰日、多公历候选、历法改革跨日及精确日期运算接口
- 优化 ΔT、章动、恒星时、月球地平线、事件根搜索和本地星历缓存,降低重复计算开销并提升边界稳定
2026-09-17 12:27:40 +08:00

424 lines
9.2 KiB
Go

package calendar
// liaoJinYuanCals 辽/金/元历相对宋基准表的年份修正表,编码同 getHanQingCals()。
var liaoJinYuanCals = memoUint32Map(func() map[int]uint32 {
return map[int]uint32{
949: 2996838400,
955: 1237097216,
958: 2858129152,
959: 1787832832,
961: 766088192,
964: 2574266112,
965: 1232086016,
973: 2464163072,
985: 3031177216,
986: 1788881664,
993: 1767184896,
994: 3645910016,
1000: 2774542080,
999: 2775716864,
1001: 3530398464,
1012: 3579124224,
1015: 2513671936,
1020: 2992512000,
1021: 1787833856,
1024: 727723008,
1025: 2507153408,
1029: 1783730688,
1039: 3667270400,
1040: 3046125056,
1044: 2463113472,
1045: 3378156800,
1049: 2907710464,
1053: 2461767424,
1056: 1823052800,
1059: 2605723136,
1064: 3912439040,
1070: 1255156992,
1073: 2991597824,
1075: 3601470208,
1077: 2513836800,
1074: 3040878080,
1078: 2511351296,
1080: 2763790592,
1093: 1531977216,
1094: 728372224,
1102: 1523258624,
1103: 1456482304,
1105: 2733216256,
1113: 635048960,
1121: 1269470464,
1129: 2874414592,
1134: 3529513728,
1145: 3041761536,
1147: 3445629184,
1152: 1689265920,
1155: 1530929920,
1163: 3595576320,
1168: 2461018624,
1175: 633116928,
1176: 628108288,
1178: 2839221504,
1184: 1264594176,
1198: 3040880384,
1207: 2904563200,
1208: 3047822080,
1209: 727721472,
1239: 1370498304,
1250: 3576701440,
1251: 1520769024,
1252: 3600820736,
1253: 1523588864,
1256: 2732596480,
1258: 3511690240,
1263: 2513447168,
1270: 3047528192,
1273: 1169888512,
1276: 1784254976,
}
})
var liaoJinYuanEras = memoEras(func() []Era {
return []Era{
{
Year: 1264,
Emperor: "元世祖",
OtherNianHaoStart: "至元",
Dynasty: "元",
},
{
Year: 1260,
Emperor: "元世祖",
Nianhao: "中统",
Dynasty: "元",
},
{
Year: 1251,
Emperor: "元宪宗",
Nianhao: "元宪宗",
Dynasty: "元",
},
{
Year: 1249,
Emperor: "元定宗后",
Nianhao: "元定宗后",
Dynasty: "元",
},
{
Year: 1246,
Emperor: "元定宗",
Nianhao: "元定宗",
Dynasty: "元",
},
{
Year: 1242,
Emperor: "元太宗",
Nianhao: "元太宗后",
Dynasty: "元",
},
{
Year: 1234,
Emperor: "元太宗",
OtherNianHaoStart: "元太宗",
Dynasty: "元",
Offset: 5,
},
{
Year: 1232,
Emperor: "金哀宗",
Nianhao: "天兴",
Dynasty: "金",
},
{
Year: 1224,
Emperor: "金哀宗",
Nianhao: "正大",
Dynasty: "金",
},
{
Year: 1222,
Emperor: "金宣宗",
OtherNianHaoStart: "元光",
Dynasty: "金",
},
{
Year: 1217,
Emperor: "金宣宗",
OtherNianHaoStart: "兴定",
Dynasty: "金",
},
{
Year: 1213,
Emperor: "金宣宗",
OtherNianHaoStart: "贞祐",
Dynasty: "金",
},
{
Year: 1213,
Emperor: "金宣宗",
OtherNianHaoStart: "至宁",
Dynasty: "金",
},
{
Year: 1212,
Emperor: "金卫绍王",
OtherNianHaoStart: "崇庆",
Dynasty: "金",
},
{
Year: 1209,
Emperor: "金卫绍王",
Nianhao: "大安",
Dynasty: "金",
},
{
Year: 1201,
Emperor: "金章宗",
Nianhao: "泰和",
Dynasty: "金",
},
{
Year: 1196,
Emperor: "金章宗",
OtherNianHaoStart: "承安",
Dynasty: "金",
},
{
Year: 1190,
Emperor: "金章宗",
Nianhao: "明昌",
Dynasty: "金",
},
{
Year: 1161,
Emperor: "金世宗",
OtherNianHaoStart: "大定",
Dynasty: "金",
},
{
Year: 1156,
Emperor: "金海陵王",
OtherNianHaoStart: "正隆",
Dynasty: "金",
},
{
Year: 1153,
Emperor: "金海陵王",
OtherNianHaoStart: "贞元",
Dynasty: "金",
},
{
Year: 1149,
Emperor: "金海陵王",
OtherNianHaoStart: "天德",
Dynasty: "金",
},
{
Year: 1141,
Emperor: "金熙宗",
Nianhao: "皇统",
Dynasty: "金",
},
{
Year: 1138,
Emperor: "金熙宗",
Nianhao: "天眷",
Dynasty: "金",
},
{
Year: 1125,
Emperor: "金太宗",
OtherNianHaoStart: "天会",
Dynasty: "金",
Offset: 2,
},
{
Year: 1121,
Emperor: "辽天祚帝",
Nianhao: "保大",
Dynasty: "辽",
},
{
Year: 1111,
Emperor: "辽天祚帝",
Nianhao: "天庆",
Dynasty: "辽",
},
{
Year: 1101,
Emperor: "辽天祚帝",
OtherNianHaoStart: "乾统",
Dynasty: "辽",
},
{
Year: 1095,
Emperor: "辽道宗",
Nianhao: "寿昌",
Dynasty: "辽",
},
{
Year: 1085,
Emperor: "辽道宗",
Nianhao: "大安",
Dynasty: "辽",
},
{
Year: 1075,
Emperor: "辽道宗",
Nianhao: "大康",
Dynasty: "辽",
},
{
Year: 1065,
Emperor: "辽道宗",
Nianhao: "咸雍",
Dynasty: "辽",
},
{
Year: 1055,
Emperor: "辽道宗",
OtherNianHaoStart: "清宁",
Dynasty: "辽",
},
{
Year: 1032,
Emperor: "辽兴宗",
OtherNianHaoStart: "重熙",
Dynasty: "辽",
},
{
Year: 1031,
Emperor: "辽兴宗",
OtherNianHaoStart: "景福",
Dynasty: "辽",
},
{
Year: 1021,
Emperor: "辽圣宗",
OtherNianHaoStart: "太平",
Dynasty: "辽",
},
{
Year: 1012,
Emperor: "辽圣宗",
OtherNianHaoStart: "开泰",
Dynasty: "辽",
},
{
Year: 983,
Emperor: "辽圣宗",
OtherNianHaoStart: "统和",
Dynasty: "辽",
},
{
Year: 979,
Emperor: "辽景宗",
OtherNianHaoStart: "乾亨",
Dynasty: "辽",
},
{
Year: 969,
Emperor: "辽景宗",
OtherNianHaoStart: "保宁",
Dynasty: "辽",
},
{
Year: 951,
Emperor: "辽穆宗",
OtherNianHaoStart: "应历",
Dynasty: "辽",
},
{
Year: 947,
Emperor: "辽世宗",
OtherNianHaoStart: "天禄",
Dynasty: "辽",
},
{
Year: 947,
Emperor: "辽太宗",
Nianhao: "大同",
Dynasty: "辽",
},
{
Year: 939,
Emperor: "辽太宗",
OtherNianHaoStart: "会同",
Dynasty: "辽",
},
}
})
var liaoJinYuanEraMap = memoEraMap(func() map[string][][]int {
return map[string][][]int{
"中统": [][]int{{1260, 1264}},
"元宪宗": [][]int{{1251, 1259}},
"元定宗后": [][]int{{1249, 1250}},
"元定宗": [][]int{{1246, 1248}},
"元太宗后": [][]int{{1242, 1245}},
"元太宗": [][]int{{1229, 1241}},
"天兴": [][]int{{1232, 1234}},
"正大": [][]int{{1224, 1231}},
"元光": [][]int{{1222, 1223}},
"兴定": [][]int{{1217, 1222}},
"贞祐": [][]int{{1213, 1217}},
"贞佑": [][]int{{1213, 1217}},
"至宁": [][]int{{1213, 1213}},
"崇庆": [][]int{{1212, 1213}},
"泰和": [][]int{{1201, 1208}},
"承安": [][]int{{1196, 1200}},
"明昌": [][]int{{1190, 1196}},
"大定": [][]int{{1161, 1189}},
"正隆": [][]int{{1156, 1161}},
"贞元": [][]int{{1153, 1156}},
"天德": [][]int{{1149, 1153}},
"皇统": [][]int{{1141, 1149}},
"天眷": [][]int{{1138, 1140}},
"天会": [][]int{{1123, 1137}},
"保大": [][]int{{1121, 1125}},
"天庆": [][]int{{1111, 1120}},
"乾统": [][]int{{1101, 1110}},
"寿昌": [][]int{{1095, 1101}},
"大安": [][]int{{1085, 1094}, {1209, 1212}},
"大康": [][]int{{1075, 1084}},
"咸雍": [][]int{{1065, 1074}},
"清宁": [][]int{{1055, 1064}},
"重熙": [][]int{{1032, 1055}},
"景福": [][]int{{1031, 1032}},
"太平": [][]int{{1021, 1031}},
"开泰": [][]int{{1012, 1021}},
"统和": [][]int{{983, 1012}},
"乾亨": [][]int{{979, 983}},
"保宁": [][]int{{969, 979}},
"应历": [][]int{{951, 969}},
"天禄": [][]int{{947, 951}},
"大同": [][]int{{947, 947}},
"会同": [][]int{{939, 946}},
}
})
func innerSolarToLunarLiaoJinYuan(date Time) Time {
year := date.solarTime.Year()
month := int(date.solarTime.Month())
day := date.solarTime.Day()
// 农历年早于对应年号表首年时 eras 为空,此类候选与主流日期完全相同且无朝代,跳过追加。
if year >= 947 && year <= 1279 {
lyear, lmonth, ganzhiMonth, lday, isLeap, ldesc := rapidLunarHan2Qing(year, month, day, 0, liaoJinYuanCals)
eras := innerEras(lyear, liaoJinYuanEras)
if len(eras) > 0 {
date.lunars = append(date.lunars, LunarTime{
solarDate: date.Solar(),
year: lyear,
month: lmonth,
day: lday,
leap: isLeap,
desc: ldesc,
comment: "",
ganzhiMonth: ganzhiMonth,
eras: eras,
})
}
}
return date
}