feat: 完善时标与天象几何计算并扩展输出接口

- 新增时标、ΔT 模型、质心时间与 UT1 支持
- 改进日月食、月掩、行星事件及路径边界计算
- 完善恒星三维自行与动态距离传播
- 扩展 SVG、GeoJSON、KML 输出与底层距离换算工具
- 整理中英文手册、示例资源及回归测试
This commit is contained in:
2026-09-23 18:55:12 +08:00
parent 1f31a9b5b5
commit 16c62a97d5
503 changed files with 33290 additions and 9471 deletions
+20 -20
View File
@@ -32,8 +32,8 @@ type LunarInfo struct {
CalendarSystem AncientCalendarSystem `json:"calendarSystem"`
// CalendarName 历法名称
CalendarName string `json:"calendarName"`
// JDE 该农历日精确的儒略日 / exact Julian day.
JDE float64 `json:"jde"`
// JD 该农历日精确的儒略日 / exact Julian day.
JD float64 `json:"jd"`
// JulianOnly 是否只存在于儒略历 / Julian-calendar-only date.
JulianOnly bool `json:"julianOnly,omitempty"`
// Dynasty 朝代,如唐、宋、元、明、清等
@@ -174,8 +174,8 @@ func (t Time) Lunar() LunarTime {
func (t Time) Add(d time.Duration) Time {
newT := t.solarTime.Add(d)
if crossesGregorianReformGap(t.solarTime, newT) {
jde := Date2JDE(t.solarTime) + d.Seconds()/86400.0
newT = basic.JDE2DateByZone(jde, t.solarTime.Location(), true)
jd := Date2JD(t.solarTime) + d.Seconds()/86400.0
newT = basic.JD2DateByZone(jd, t.solarTime.Location(), true)
}
rT, _ := SolarToLunar(newT)
return rT
@@ -213,10 +213,10 @@ type LunarTime struct {
calendarSystem AncientCalendarSystem
//历法名称
calendarName string
// julianOnly 该农历日是否只存在于儒略历(如 700-02-29);Solar 取后继日作为标签。
// julianOnly 该农历日是否只存在于儒略历(如 700-02-29);Solar 取后继日作为规范日。
julianOnly bool
// jde 该农历日精确的儒略日,仅在 julianOnly 时显式保存。
jde float64
// jd 该农历日精确的儒略日,仅在 julianOnly 时显式保存。
jd float64
eras []EraDesc
}
@@ -226,12 +226,12 @@ func (l LunarTime) JulianOnly() bool {
return l.julianOnly
}
// JDE 该农历日精确的儒略日;儒略历独有闰日比 Solar() 早一天 / exact Julian day.
func (l LunarTime) JDE() float64 {
if l.julianOnly && l.jde > 0 {
return l.jde
// JD 该农历日精确的儒略日;儒略历独有闰日比 Solar() 早一天 / exact Julian day.
func (l LunarTime) JD() float64 {
if l.julianOnly && l.jd > 0 {
return l.jd
}
return Date2JDE(l.solarDate)
return Date2JD(l.solarDate)
}
// JulianOnly 主历法农历日是否只存在于儒略历 / whether the primary date is Julian-calendar-only.
@@ -242,12 +242,12 @@ func (t Time) JulianOnly() bool {
return t.lunars[0].JulianOnly()
}
// JDE 主历法农历日精确的儒略日 / exact Julian day of the primary lunar date.
func (t Time) JDE() float64 {
// JD 主历法农历日精确的儒略日 / exact Julian day of the primary lunar date.
func (t Time) JD() float64 {
if len(t.lunars) == 0 {
return Date2JDE(t.solarTime)
return Date2JD(t.solarTime)
}
return t.lunars[0].JDE()
return t.lunars[0].JD()
}
// SolarCandidates 该农历日的全部合法公历候选,首个恒等于 Solar() / every legal civil date, Solar() first.
@@ -287,8 +287,8 @@ func (l LunarTime) GanZhiMonth() string {
// GanZhiDay 日干支 / sexagenary day name.
func (l LunarTime) GanZhiDay() string {
if l.julianOnly && l.jde > 0 {
return ganZhiOfJDE(l.jde)
if l.julianOnly && l.jd > 0 {
return ganZhiOfJD(l.jd)
}
return GanZhiOfDay(l.solarDate)
}
@@ -419,7 +419,7 @@ func (l LunarTime) LunarInfo() []LunarInfo {
EraDesc: v.String(),
LunarWithEraDesc: v.String() + l.desc,
ChineseZodiac: l.ShengXiao(),
JDE: l.JDE(),
JD: l.JD(),
JulianOnly: l.julianOnly,
}
res = append(res, li)
@@ -445,7 +445,7 @@ func (l LunarTime) LunarInfo() []LunarInfo {
EraDesc: lunarYearDesc(l.year) + "年",
LunarWithEraDesc: lunarYearDesc(l.year) + "年" + l.desc,
ChineseZodiac: l.ShengXiao(),
JDE: l.JDE(),
JD: l.JD(),
JulianOnly: l.julianOnly,
}
res = append(res, li)