CalcChineseCalendar 是一个基于 JPL DE BSP 星历文件的历法与天文计算工具,提供:
- 命令行工具
lunar - 动态库
lunar_dll(导出 C API) - 面向 C++ 的可复用计算接口(
lunar::core)
- 农历月枚举:
months - 年度节气/月相日历:
calendar、year - 单事件求解:
event - 星历下载:
download - 时刻查询与批处理:
at - 公历/农历互转与批处理:
convert - 单日/单月视图:
day、monthview - 事件检索:
next、range、search - 日月食:
eclipse - 传统节日与黄历摘要:
festival、almanac - 星历信息与自检:
info、selftest - 配置管理与补全脚本:
config、completion - 交互式模式(无参数启动)
- CMake 3.20+
- 支持 C++20 的编译器
- 运行时需要 BSP 文件(
.bsp) download get需要系统中存在curl或wget
cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release --parallelcmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build -j- 可执行程序:
lunar - 动态库:
lunar_dll(输出名为lunar,对应平台扩展名)
lunar download list当前内置 ID:
de440(约 114MB,1550-2650)de440s(约 31MB,1850-2150)de441p1(约 1.5GB,-13200-1969)de441p2(约 1.5GB,1969-17191)de442(约 114MB,1550-2650)de442s(约 31MB,1850-2150)
lunar download get de442s --dir .lunar --help
lunar --version
lunar <command> [args...]无参数启动会进入交互模式。
--eclipse-method modern|legacy--lang zh|en|ja|ko
--lang 也接受常见别名:
zh-cn/cn/zh-hansen-us/usja-jp/jpko-kr/kr
所有需要星历的命令都支持:
--bsp <path>--bsp=<path>
示例:
lunar day 2025-06-01 --bsp ./de442.bsp以下可用,等价于 months:
lunar <bsp> <years> [months options...]entry 会在命令分发前调用 prep_cmd_args() 自动补 bsp。
months calendar year event at convert day monthview next range search eclipse festival almanac info selftest
不需要 BSP 的命令:
download config completion
按以下顺序收集并去重(仅保留存在的文件):
def_bspbsp_listbsp_dir目录下所有.bsp- 当前工作目录下所有
.bsp
- 若命令可推断时间区间,优先选择“完整覆盖该区间”的 BSP。
- 若无完整覆盖,选择与区间重叠最多的 BSP。
- 若无法推断区间,使用候选列表第一个。
- 若没有可用候选,抛出错误并提示使用
--bsp或lunar config set def_bsp。
bsp_dirdef_bspbsp_listdefault_tzdefault_langdef_fmtdef_prety
lunar config show [--format json|txt] [--out <path>] [--pretty 0|1] [--quiet]
lunar config set <key> <value>bsp_list支持逗号或分号分隔。def_bsp设置后若不在bsp_list中,会自动追加。default_lang仅允许zh|en|ja|ko。def_fmt允许txt|json|csv|jsonl|ics。def_prety用0|1。
YYYY-MM-DDYYYY-MM-DDZYYYY-MM-DD+08:00/YYYY-MM-DD-05:00YYYY-MM-DDTHH:MMYYYY-MM-DDTHH:MM:SSYYYY-MM-DDTHH:MM:SS.sss- 以上均可带
Z或±HH:MM
如果输入不带时区,使用命令参数中的解析时区(如 --input-tz)或配置中的 default_tz。
--tz只影响显示时区。- 农历判日固定按 UTC+8 民用日边界执行。
命令按各自支持范围可输出:
txtjsonjsonlcsvicsgeojson(食相关)
多数 JSON 输出包含 meta,核心字段通常包括:
toolversionschemaephemtz_displaynotes
lunar months <bsp> <years>
[--mode lunar|gregorian]
[--format json|txt|csv] [--out <path>] [--tz +08:00|Z|-05:00]
[--pretty 0|1] [--quiet] [--include-eclipses 0|1]
[--output <json>] [--output-txt <txt>] # deprecated说明:
<years>支持:2025、2024-2026、2024,2026,2030-2032。--include-eclipses 1时,--format csv不可直接使用。--output/--output-txt为旧接口;不能与--out同时使用。- 多年计算时若非
--quiet,stderr 仅输出年份进度。
lunar calendar <bsp> [<years>]
[--format json|txt|ics] [--out <path>] [--tz ...]
[--include-months 0|1] [--include-eclipses 0|1] [--pretty 0|1] [--quiet]说明:
- 省略
<years>时默认使用2025。 ics仅导出节气和月相事件。- 多年计算时若非
--quiet,stderr 仅输出年份进度。
lunar year <bsp> <year>
[--mode lunar|gregorian]
[--format json|txt|ics] [--out <path>] [--tz ...]
[--pretty 0|1] [--quiet]lunar event <bsp> solar-term <code> <year>
lunar event <bsp> lunar-phase <new_moon|fst_qtr|full_moon|lst_qtr> --near <YYYY-MM-DD>
[--format json|txt|ics] [--out <path>] [--tz ...] [--pretty 0|1] [--quiet] [--eclipse 0|1]
# 也支持直接转发到 eclipse 命令:
lunar event <bsp> lunar-eclipse --near <YYYY-MM-DD> ...
lunar event <bsp> solar-eclipse --near <YYYY-MM-DD> ...说明:
solar-term的code使用J1..J12、Z1..Z12。lunar-phase必须提供--near。--eclipse 1用于在满月事件输出中附加月食细节。
lunar download list
lunar download get <id> [--dir <path>] [--quiet]lunar at <bsp> <time>
lunar at <bsp> --time <time>
lunar at <bsp> --stdin
lunar at <bsp> --file <path>
[--input-tz ...] [--tz ...]
[--format json|txt|jsonl] [--out <path>] [--pretty 0|1] [--quiet]
[--events 0|1] [--eot-lon <deg>] [--jobs N] [--meta-once 0|1]说明:
- 批模式:
--stdin与--file互斥。 - 批模式下若同时给位置参数
<time>,该位置参数会被忽略。 - 单次模式下
--format jsonl会自动回退为json。 --jobs已接受,但当前执行器仍按顺序运行。- 默认
tz/format/pretty来自lun_cfg.txt(default_tz/def_fmt/def_prety)。
lunar convert <bsp> <dt_or_tm>
[--input-tz ...] [--tz ...]
[--format json|txt|jsonl] [--out <path>] [--pretty 0|1] [--quiet]
[--stdin|--file <path>] [--jobs N] [--meta-once 0|1]
lunar convert <bsp> --from-lunar <lunar_year> <month_no> <day> [--leap 0|1]
[--tz ...] [--format json|txt|jsonl] [--out <path>] [--pretty 0|1] [--quiet]说明:
--from-lunar模式下不能再传位置参数<dt_or_tm>。--stdin与--file互斥。- 单次模式下
--format jsonl会自动回退为json。 - 默认
tz/format/pretty来自配置。
lunar day <bsp> <YYYY-MM-DD>
[--tz ...] [--format json|txt|csv|jsonl] [--out ...] [--pretty 0|1] [--quiet]
[--at HH:MM[:SS]] [--events 0|1] [--lon <deg>]
[--astro 0|1] [--astro-mode less|all|pick] [--astro-pick id,en,zh,...]
[--astro-lat deg --astro-lon deg [--astro-height m]]说明:
--astro-lat与--astro-lon必须同时出现。--astro-height只能在已给经纬度时使用。- 逻辑实现走
lunar::core::compute_day+lunar::core::format_day_output。 - 默认
tz/format/pretty来自配置。
lunar monthview <bsp> <YYYY-MM>
[--tz ...] [--format json|txt|csv] [--out ...] [--pretty 0|1] [--quiet]
[--astro 0|1] [--astro-mode less|all|pick] [--astro-pick id,en,zh,...]
[--astro-lat deg --astro-lon deg [--astro-height m]]说明:
--astro-lat与--astro-lon必须同时出现。- 默认
tz/format/pretty来自配置。
lunar next <bsp> --from <time> --count N
[--kinds solar_term,lunar_phase,lunar_eclipse,solar_eclipse]
[--tz ...] [--format json|txt|csv|ics|jsonl]
[--out ...] [--pretty 0|1] [--quiet] [--eclipse 0|1]说明:
--from必填,--count >= 1。- 默认
kinds为四类并集;当前实现的基础事件池来自节气与月相,--eclipse 1可为满月行追加月食细节字段。 - 默认
tz/format/pretty来自配置。
lunar range <bsp> --from <time> --to <time>
[--kinds solar_term,lunar_phase,lunar_eclipse,solar_eclipse]
[--tz ...] [--format json|txt|csv|ics|jsonl]
[--out ...] [--pretty 0|1] [--quiet] [--eclipse 0|1]说明:
--from、--to必填,且--to >= --from。--kinds包含食类时,会加载对应食事件。- 默认
tz/format/pretty来自配置。
lunar search <bsp> <query>
[--from <time>] [--count N] [--tz ...]
[--format json|txt|csv|ics|jsonl] [--out ...] [--pretty 0|1] [--quiet] [--eclipse 0|1]说明:
- 当前仅支持以
next ...开头的 query。 - 内部实现是转成
next参数再调用cmd_next。 - 默认值:
from=2025-01-01T00:00:00+08:00、count=1、format=txt、tz=+08:00、pretty=1。
lunar eclipse <bsp> --near <YYYY-MM-DD> [--kind lunar|solar]
[--stage any|umb|total] (lunar)
[--stage any|central] (solar)
[--sample-min <minutes>]
[--point-lat <deg> --point-lon <deg> [--point-height <m>]] [--point-refine 0|1]
[--global-vis 0|1] [--global 0|1]
[--global-format json|geojson]
[--grid-lat-step <deg>] [--grid-lon-step <deg>]
[--tz ...] [--format json|txt|geojson] [--out ...] [--pretty 0|1] [--quiet]说明:
--near必填。--kind默认lunar。--point-lat与--point-lon必须同时出现。--format geojson会强制开启全局可见性计算。- 默认
tz/format/pretty来自配置(def_fmt非json|txt|geojson时回退到json)。
lunar festival <bsp> <year>
[--tz ...] [--format json|txt|csv] [--out ...] [--pretty 0|1] [--quiet]默认 tz/format/pretty 来自配置。
lunar almanac <bsp> <YYYY-MM-DD>
[--tz ...] [--format json|txt|csv] [--out ...] [--pretty 0|1] [--quiet] [--lon <deg>]默认 tz/format/pretty 来自配置。
lunar info <bsp> [--format json|txt] [--out ...] [--pretty 0|1] [--quiet]说明:
- 默认格式固定为
txt(不读取def_fmt)。 - 输出包含文件存在性、大小、SPK 覆盖区间等信息。
lunar selftest <bsp> [--format json|txt] [--out ...] [--pretty 0|1] [--quiet]说明:
- 默认格式固定为
txt。 - 当前内置测试用例包括
at_illum、conv_rt、y25_cnt。 - 通过返回码
0,失败返回1。
lunar config show [--format json|txt] [--out ...] [--pretty 0|1] [--quiet]
lunar config set <key> <value>lunar completion bash|zsh|fish|powershell脚本输出到 stdout,可自行重定向到文件。
直接运行 lunar(无参数)。
- 读取
lun_cfg.txt - 若
def_bsp存在,会提示是否继续使用 - 可指定额外目录扫描
.bsp - 如未找到可用星历,可进入下载界面
1months2calendar3at4convert5day6next7festival8info9selftest10monthview11range12search13eclipse14almanac15config16completiond切换/下载 BSPh帮助q退出
- 命令行:
--lang zh|en|ja|ko - 配置默认:
default_lang
优先级:命令行高于配置默认。
- 交互界面文案(
src/i18n/catalog_interact.cpp) - 事件名称翻译(
src/i18n/catalog_event.cpp) - 星体/天象相关文案(
src/i18n/catalog_astro.cpp) - 部分 CLI 提示与注释
结构化 JSON 的键名保持稳定,不随语言改变。
include/lunar/core.hppinclude/lunar/models.hppinclude/lunar/day_formatter.hpp
#include "lunar/core.hpp"
#include "lunar/day_formatter.hpp"
lunar::core::DayComputeOptions opt;
opt.ephem = "./de442.bsp";
opt.date_text = "2025-06-01";
opt.tz = "+08:00";
opt.include_events = true;
DayResult result = lunar::core::compute_day(opt);
lunar::core::format_day_output(std::cout, result, "json", true);AtData、DayResult 已公开在 include/lunar/models.hpp。
头文件:include/lunar/c_api.h
lunar_tool_verlunar_last_errorlunar_clear_errorlunar_runlunar_root_batch
lunar_calc_eotlunar_core_day
已提供包装:
month cal year event dl at conv day mview next range search fest alm info test cfg comp
说明:eclipse 当前未单独导出 lunar_cmd_eclipse,可通过 lunar_run 调用。
0:成功2:参数错误(std::invalid_argument)1:其他错误
include/lunar/ 公共头文件(CLI/C++ API/C API)
src/cli/ months/calendar/year/event/download 相关实现
src/query/ at/convert/day/monthview/next/... 相关实现
src/i18n/ 多语言目录与词条
src/interact.cpp 交互模式
src/global_context.cpp 全局配置与自动 BSP 选择
src/entry.cpp CLI 顶层参数解析与命令分发
src/cli.cpp cli 模块聚合编译入口
src/query.cpp query 模块聚合编译入口
src/c_api.cpp C API 导出实现
lun_cfg.txt 运行时配置文件
- 感谢 @ytliu0 在中国历法与天文计算相关资料上的长期贡献。
- 感谢 JPL NAIF 公开发布 DE 系列 BSP 星历文件,为本项目提供高质量基础数据。
- 感谢 Hipparcos(HIP)星表与相关公开整理数据,为项目中的恒星条目与编号体系提供参考基础。
# 设置默认星历和语言
lunar config set def_bsp ./de442.bsp
lunar config set default_lang zh
# 新语法:不再手动输入 <bsp>
lunar day 2025-06-01 --format json
# 覆盖本次使用的星历
lunar day 2025-06-01 --bsp ./de440s.bsp --format txt
# 区间事件
lunar range --from 2025-01-01 --to 2025-12-31 --format json --kinds solar_term,lunar_phase
# 食计算
lunar eclipse --near 2025-09-07 --kind lunar --global-vis 1 --global-format geojson --format json