记一次开发农历日期计算器的过程
记一次开发农历日期计算器的过程
缘起:闲得发慌突然想写一个没啥用的东西
最近在看日期看看什么时候开学时突发奇想想开发一个虽然没啥用小工具但是还浪费时间的工具——一个能够同时显示公历和农历的日期计算器。这个想法完全是闲出屁来才写的,不考虑任何实用性
环境配置
我的开发环境:
- 操作系统:Arch Linux 2025.08.01
- Python版本:3.11.4
- 开发工具:VS Code + Jupyter扩展 + vim
依赖安装
农历计算目前没有任何公式可以准确计算所有需要专门的库支持,翻阅大量文献,我选择了zhdate:
1 | pip install zhdate |
这个库专门处理中国农历日期转换,可以解决复杂的闰月计算问题。
思路与实现过程
核心功能分解
- 公历日期计算:计算从今天到目标日期的天数差
- 农历转换:将公历日期转换为农历日期
- 额外信息:显示生肖、天干地支、闰年信息
功能1:公历日期计算
思考过程:
- 需要计算两个日期之间的天数差
- Python本身就有强大的日期处理模块
datetime - 关键是要确保两个日期对象类型一致
计算天数差:
1 | from datetime import date |
功能2:农历日期转换
思考过程:
zhdate库可以将公历日期转换为农历日期- 需要将
date对象转换为datetime对象(库的要求) - 农历日期天干地支、闰月等需要特殊格式化
实现如下:
1 | from zhdate import ZhDate |
功能3:用户界面与额外信息
思考过程:
- 需要友好的用户输入提示
- 显示清晰的格式化结果
- 添加闰年和生肖信息增加实用性
关键代码:
1 | def main(): |
踩坑实录
第一坑:日期类型不一致
写完代码后兴奋地运行:
1 | target = datetime(2025, 8, 8) # datetime对象 |
结果:
1 | TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'datetime.date' |
错啦!!!!为什么?
盯着错误信息看了半天才想起来:Python的datetime和date是两种不同的类型!虽然它们看起来很相似,但不能直接运算。
解决方案也很简单,统一使用date类型就好了:
1 | # 统一使用date类型 |
第二坑:消失的闰月属性
农历功能实现方法:
1 | lunar = ZhDate.from_datetime(target_dt) |
结果运行时报错:
1 | AttributeError: 'ZhDate' object has no attribute 'is_leap_month' |
又双叒叕错啦!!!!为什么?
查了zhdate的GitHub才发现,原来是新版本移除了这个属性!API变更真是开发者的噩梦啊。
只能顺着作者的意思修改了:
1 | # 改用字符串判断 |
第三坑:混乱的生肖年份
测试2025年1月1日:
1 | 农历日期: 甲辰年(龙)腊月初二 |
好像没什么问题,没报错…….
求证麻袋,2025不是蛇年吗?
不对,农历新年通常在公历1月下旬到2月中旬之间,所以公历的2025年1月1日还没过农历年,所以还是甲辰年龙年,生肖应该是龙
解决方案:
1 | # 错误:使用公历年份计算生肖 |
第四坑:负数天数显示
当目标日期是过去的时间时:
1 | 距离目标日期还有 -365 天 |
WTF?负数???我还能回到过去吗???
解决可以用绝对值把这个数变为正数
所以:
1 | if days_diff < 0: |
所以:
完整实现代码如下:
1 | from datetime import datetime, date |
运行测试过程
1:春节计算
1 | 公历农历日期计算器 |
2:跨年测试
1 | 公历农历日期计算器 |
3:过去日期
1 | 公历农历日期计算器 |
总结与碎碎念
首先先总结几点:
- 类型一致性:在Python的
date和datetime看似毫不相干其实也毫无关系 - 第三方库API会变:要注意关注依赖库的更新日志,不然S13作者突然改了或者删库跑路了都不知道
- 写这个代码只是为了好玩: just for fun
最终完成的农历日期计算器虽然代码量不大,但实际上也没啥用。它除了能计算日期差,还能显示详细的农历信息,包括天干地支、生肖和闰月情况就没有任何作用啦!
写在最后
我乱写的,你能看到这我也是服了你
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 feng's blog!


