还在为查农历节气不准抓狂?还在找功能全、无依赖的黄历算法库?
今天给各位开发者和传统文化爱好者安利一款宝藏开源项目——cnLunar,一款基于 Python 开发的中国农历综合算法库,精准、轻量、功能全,堪称农历开发的 “天花板”!
从项目建立到项目初步完成,前后历时三年
一是因为项目只有一人开发;
二是由于时代跨度极大,这个领域很多书籍都是前后矛盾。
比如这个obsession-grace的开发者就提出了不同:
obsession-grace commented 9 days ago1.年干支切换以立春节为准,不是农历新年;2022年2月4日04:50:36前为辛丑年辛丑月丁亥日,之后为壬寅年壬寅月丁亥日;2.换月最好能精确到具体时间,除立春外,其他节气到点之前请按上个月纪月。
为了适配这个问题或对农历算法的不同观点,我就在最新的节点里添加了一个_x,来做动态调整
self._x = 1ifself.year8Char == 'beginningOfSpring'andself.nextSolarTermYear == self.lunarYear andself.nextSolarNum < 3else0
_前缀在python开发中一般表示内部变量或临时变量,这样就可以适配更多不同观点算法的用户,满足他们的需求,虽然复杂,但总体来说,在github上发项目还是很有意思的。
为什么说 cnLunar 是 “天花板级” 农历库?
1. 算法精准✅:告别 “经验公式”,用天文数据说话
很多农历项目依赖的 “寿星公式” 本质是经验拟合公式,200 年内要手动加 22 个矫正值,算出来的节气、八字动辄出错。
而 cnLunar 直接摒弃这种不靠谱的算法,采用香港天文台《公历农历对照表》(1901-2100 年实测 / 预测天文数据) 开发,基于阴阳合历的核心逻辑,节气、闰月、八字计算精准度拉满,从源头避免误差!

2. 极简部署🚀:无数据库 + 零额外依赖,pip 一键搞定
做开发最烦 “环境配半天”,cnLunar 把 “轻量化 + 小白友好” 做到了极致:
- 全程零第三方库依赖,仅依托 Python 基础库运行,Windows/macOS/Linux 全兼容,不用费心安装各种依赖包;
- 为了让新手快速上手,项目彻底抛弃数据库服务依赖,将香港天文台的核心历法数据通过向量压缩法 + 十六进制编码 直接存储在代码中 —— 春节日期、闰月信息、二十四节气等关键数据,都以二进制 / 十六进制的压缩形式封装,读取时仅需简单的位移、按位与运算即可高效解析,既保证数据精准,又让运行速度拉满;
- 就能安装,配套 demo.py 示例代码,复制粘贴就能跑,直接获取农历、八字、宜忌、星宿等数据。
3. 功能拉满📚:700 + 行代码还原千年传统历法
cnLunar 不止是 “公历转农历”,而是真正把传统历法的精髓搬上代码:
- 「历法部分」:公历农历互转、二十四节气、季节计算,精准到时分秒;
- 「传统部分」:八字、每日宜忌、十二神、二十八星宿、纳音、彭祖百忌、中医时辰经络…… 甚至还原了《四库全书・钦定协纪辨方书》的 700 + 行核心逻辑,每一条宜忌都有古籍依据;
- 「补充部分」:星座、公历节日、西方节日,兼顾中西需求。
4. 设计走心💡:面向对象 + 清晰命名,二次开发超友好
项目采用面向对象设计,核心类Lunar开箱即用,传入 datetime 就能调用所有功能:
import datetimeimport cnlunar# 初始化:指定时间,也可默认当前时间a = cnlunar.Lunar(datetime.datetime(2022,11,14,10,30))# 直接获取农历年月日print(a.lunarYear, a.lunarMonth, a.lunarDay)# 获取每日宜忌print(a.get_AngelDemon())
针对传统历法的特殊命名,项目制定了清晰的规则(驼峰 + 拼音 / 数字前缀),不用对着变量名猜含义,新手也能轻松二次开发。
不止是 Python 库,更是活跃的开源生态🌐
cnLunar 的优秀早已被开发者认可:
- 多语言移植:已有 Dart/Flutter、Kotlin(Android)、C#(VRChat)、Flask 等版本,覆盖移动端、Web 端、跨平台场景;
- 商用落地:被「翻黄历」网站、App Store「万年历 - 最新专业桌面老黄历」等产品采用,经受住了实际场景的考验;
- 社区共建:多位开发者贡献代码、反馈问题,项目长期维护,持续迭代优化。
良心开源!MIT 协议,免费商用无压力🔓
最值得夸的是,cnLunar 全程开源免费、无盈利行为,采用宽松的 MIT 开源协议 —— 你可以自由使用、修改、分发,甚至商用,只需保留版权声明即可。
对比很多 “伪开源” 项目,这份诚意真的太难得!
这款宝藏项目的价值,需要更多人看见!如果你觉得 cnLunar 有用:
- 去 GitHub 给项目点个⭐Star(对开源作者来说,这是最大的鼓励);
- Fork 一份到自己仓库,自用或基于它做二次开发;
- 转发给身边需要做农历 / 黄历开发的朋友,让更多人受益。
