feat: 引入可切换星历模型并扩展天象观测链路
- 新增半解析、旧模型、自定义与多源堆叠星历实例,提供 Context、Instance、SPK 读取及状态与视位置计算 - 统一太阳、月球和行星实例接口,扩展黄经穿越、留、相位、最近角距、偕日可见、任意高度升落、轨道节点及凌日等天象查询 - 完善日月食、月掩与凌日的月缘剖面、有限盘面接触、站心修正、局地可见性、全球路径和地图输出 - 新增 SVG、GeoJSON、KML 天象输出及凌日、月掩和月缘地形相关缓存与几何求解 - 新增恒星星表导入与查询,支持 CSV、Hipparcos、BSC5、Stellarium 等格式及名称、交叉标识、锥面检索和星等过滤 - 补充 IAU 2006、地球定向、折射消光、大气观测、轨道传播及半解析行星/月球数据支持 - 将默认未来民用时标切换为 TimeScaleLeapHour,更新 2027–2400 农历速查表、中文日期解析和时区边界处理 - 增加事件基线、跨模型回归、几何边界、月缘地形和输出契约测试,完善中英文手册、示例资源、NOTICE 与忽略规则
This commit is contained in:
+16
-22
@@ -336,7 +336,7 @@ zhuanxu 颛顼历 <nil>
|
||||
|
||||
- **默认路由**:按年份自动选择,先秦段使用春秋/古六历重建,`-220..-104` 使用秦汉颛顼历,`-103..1912` 使用历表,`1913` 年后使用现代算法。
|
||||
- **显式古历**:如果需要指定某一古历系统,请使用 `SolarToLunarWithCalendar` / `LunarToSolarWithCalendar` 这类 API。
|
||||
- **数据来源**:古历部分主要参考《寿星天文历》;使用 [ytliu0教授的网站数据](https://ytliu0.github.io/ChineseCalendar/index_simp.html)做验证校验;现代段依据GB/T 33661-2017编排,通过 VSOP87、ELP定气定朔 。
|
||||
- **数据来源**:古历部分主要参考《寿星天文历》;使用 [ytliu0 教授的网站数据](https://ytliu0.github.io/ChineseCalendar/index_simp.html) 交叉校验;现代段按 GB/T 33661-2017 编排,用 VSOP87 与 ELP 级数定朔定气。
|
||||
- **节气**:`JieQi` 返回现代天文计算的节气时刻;`CalendricalJieQi` 返回历法相符节气日期。
|
||||
|
||||
---
|
||||
@@ -362,7 +362,7 @@ zhuanxu 颛顼历 <nil>
|
||||
|
||||
本package主要面向中国历法,因此定气和定朔的计算默认采用北京时间(UTC+8)。对于使用其他时区的地区,若直接套用中国农历的编排规则,可能会产生日期偏差。
|
||||
|
||||
为方便探索与研究,本包 提供了底层方法 `Solar` 和 `Lunar`,它们支持在**自定义时区**下,按照**现行中国农历算法(GB/T 33661-2017)** 进行公历与农历的相互转换。
|
||||
`Solar` 与 `Lunar` 是底层入口,允许在**自定义时区**下按**现行中国农历算法(GB/T 33661-2017)**互转公历与农历。
|
||||
如果只需北京时间下的标准转换,请直接使用封装好的 `SolarToLunar` 和 `LunarToSolar` 方法。
|
||||
|
||||
**示例**:农历规则要求冬至必须落在农历十一月。以1984年冬至为例,计算可得:
|
||||
@@ -377,7 +377,7 @@ fmt.Println(moon.ClosestShuoYue(ws))
|
||||
| 冬至 | 1984-12-22 | 1984-12-21 |
|
||||
| 朔日 | 1984-12-22 | 1984-12-22 |
|
||||
|
||||
可见,对于东八区(中国),1984年12月22日既是冬至又是朔日,因此该日为农历十一月初一;而在东七区,冬至提前至12月21日,导致12月22日已成为腊月初一。
|
||||
对于东八区(中国),1984年12月22日既是冬至又是朔日,因此该日为农历十一月初一;而在东七区,冬至提前至12月21日,导致12月22日已成为腊月初一。
|
||||
|
||||
类似地,春节的公历日期也可能相差一个月。按本例的历法口径,1985 年正月初一在东八区对应 2 月 20 日,在东七区对应 1 月 21 日:
|
||||
```go
|
||||
@@ -389,7 +389,7 @@ fmt.Println(calendar.Solar(1985, 1, 1, false, 7.0))
|
||||
|
||||
⚠️ Go 标准库 `time.Time` 在历法处理上与本程序存在差异:
|
||||
|
||||
- Go 语言在1582年10月15日之前使用逆推格里高利历,而非儒略历。若不使用 `Add` 方法,一般可正常使用。
|
||||
- Go 语言在 1582-10-15 之前使用逆推格里高利历,而非儒略历;只要不调用 `time.Time` 的 `Add`/`AddDate`,其余用法不受影响。
|
||||
- 因此,**在1582年10月15日之前,`time.Time.Weekday()` 返回结果与本程序计算结果不一致**。
|
||||
例如:1582年10月4日,本程序为星期四,Go 语言判断为星期一。
|
||||
|
||||
@@ -510,9 +510,7 @@ func main() {
|
||||
输出结果:
|
||||
|
||||
```text
|
||||
// 同一公历时刻在三国并立时期会映射到多个政权各自的农历结果
|
||||
[魏明帝 景初三年腊月二十 蜀后主 延熙二年冬月十九 吴大帝 赤乌二年冬月二十]
|
||||
// 结构化农历信息输出;每个对象对应一个政权口径下的结果
|
||||
[魏明帝 景初三年腊月二十 蜀后主 延熙二年冬月十九 吴大帝 赤乌二年冬月二十] // 同一公历时刻在三国并立时期会映射到多个政权各自的农历结果
|
||||
[
|
||||
{
|
||||
"solarDate": "0240-01-01T08:08:08.000000008+08:00",
|
||||
@@ -580,13 +578,10 @@ func main() {
|
||||
"lunarWithNianhaoDesc": "赤乌二年冬月二十",
|
||||
"chineseZodiac": "羊"
|
||||
}
|
||||
]
|
||||
// “元丰六年十月十二日”对应的公历日期
|
||||
1083-11-24 00:00:00 +0800 CST
|
||||
// 同一天在并行政权下还会命中辽道宗大康九年十月十二
|
||||
[宋神宗 元丰六年十月十二 辽道宗 大康九年十月十二]
|
||||
// 现代农历日期转换结果;2026 年正月初一对应 2026-02-17
|
||||
2026-02-17 00:00:00 +0800 CST
|
||||
] // 结构化农历信息输出;每个对象对应一个政权口径下的结果
|
||||
1083-11-24 00:00:00 +0800 CST // “元丰六年十月十二日”对应的公历日期
|
||||
[宋神宗 元丰六年十月十二 辽道宗 大康九年十月十二] // 同一天在并行政权下还会命中辽道宗大康九年十月十二
|
||||
2026-02-17 00:00:00 +0800 CST // 现代农历日期转换结果;2026 年正月初一对应 2026-02-17
|
||||
```
|
||||
|
||||
## 节气
|
||||
@@ -616,12 +611,11 @@ func main() {
|
||||
|
||||
输出结果
|
||||
|
||||
```
|
||||
2020-02-04 17:03:20.471614301 +0800 CST
|
||||
2020-12-21 18:02:20.648710727 +0800 CST
|
||||
2020-03-20 11:49:37.149532735 +0800 CST
|
||||
2020-03-20 11:49:37.149532735 +0800 CST
|
||||
|
||||
```text
|
||||
2020-02-04 17:03:19.850052595 +0800 CST
|
||||
2020-12-21 18:02:20.574118494 +0800 CST
|
||||
2020-03-20 11:49:37.111029624 +0800 CST
|
||||
2020-03-20 11:49:37.111029624 +0800 CST
|
||||
```
|
||||
|
||||
历法相符节气示例:
|
||||
@@ -636,7 +630,7 @@ fmt.Printf("%d-%02d-%02d %v\n", date.Year(), int(date.Month()), date.Day(), err)
|
||||
|
||||
输出结果
|
||||
|
||||
```
|
||||
```text
|
||||
1582-12-22 00:00:00 +0800 CST <nil>
|
||||
-202-12-25 <nil>
|
||||
```
|
||||
@@ -653,7 +647,7 @@ fmt.Printf("%d-%02d-%02d %v\n", date.Year(), int(date.Month()), date.Day(), err)
|
||||
|
||||
### 时标
|
||||
|
||||
- 公开 API 的时刻一律按民用时刻处理,也就是把 `time.Time` 的字段直接当作 UTC 标签读取。库内把民用时刻换算到 TT 时,1972-01-01 之前按 UT1 处理,精确窗口内使用内置闰秒表;需要显式换算时用根包的 `astro.UT1FromUTC` / `astro.TTFromUTC` / `astro.DUT1`。
|
||||
- 公开 API 的时刻一律按民用时刻处理,也就是把 `time.Time` 的字段直接当作 UTC 标签读取。库内把民用时刻换算到 TT 时,1972-01-01 之前按 UT1 处理,此后使用内置闰秒表;需要显式换算时用根包的 `astro.UT1FromUTC` / `astro.TTFromUTC` / `astro.DUT1`。
|
||||
- `JieQi` 与 `WuHou` 的返回值是北京时间下的民用时刻,小数秒保留完整精度;`CalendricalJieQi*` 固定返回北京时间当天 0 点。
|
||||
- `JD`、`Date2JD`、`NowJD` 都是同一个民用口径的儒略日浮点数:`2026-02-17` 的北京民用日对应 `2461088.5`。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user