php无内置农历函数,需用overtrue/chinese-calendar包实现;它基于权威天文算法,支持1900–2100年农历、节气、干支、生肖等,安装简单、调用便捷,避免手写错误。

PHP没有内置农历计算函数
PHP标准库不提供农历(阴历)转换能力,date()、DateTime 等所有原生日期函数只处理公历(阳历)。强行用时区或偏移模拟农历会出错——农历是阴阳合历,闰月、节气、朔日规则复杂,不能靠加减天数推算。
推荐用 overtrue/chinese-calendar Composer 包
这是目前最稳定、维护活跃的 PHP 农历工具,基于权威农历算法(含 1900–2100 年数据),支持节气、干支、生肖、宜忌等。安装后直接调用即可:
composer require overtrue/chinese-calendar
基础用法示例:
$date = new \Overtrue\ChineseCalendar\Calendar('2024-02-10'); // 公历日期
echo $date->getLunarDate(); // 输出:二〇二四年正月初一
echo $date->getYearGanZhi(); // 输出:甲辰
echo $date->getAnimal(); // 输出:龙
- 构造参数支持
string(如'2024-02-10')、DateTime实例、时间戳 -
getLunarDate()返回带中文年月日的字符串,不含节气;如需节气,用getSolarTerm() - 注意:该包默认返回简体中文,若项目用 UTF-8 外编码(如 GBK),需自行转码,否则显示乱码
自己写算法?别试了
网上能找到的“纯 PHP 农历算法”几乎都基于简化查表或错误的闰月规则,1949 年后尤其容易错(比如把 1966 年闰三月算成闰四月)。真实农历依赖紫金山天文台发布的《中国天文年历》,其计算涉及太阳黄经、月亮朔望时刻等天文参数,PHP 浮点精度和无高精度时间库支撑下无法可靠实现。
- 哪怕只需求“某天是不是春节”,也建议用现成包而非手写判断逻辑
- 若服务器无法装 Composer(如老旧共享主机),可考虑用轻量 API(如「聚合数据」农历接口),但需网络请求和 API Key 管理
- 缓存策略很重要:农历数据年粒度固定,对同一日期反复调用
Calendar实例无需重复计算,可封装单例或静态缓存
注意节气和农历日期不是一回事
常有人混淆“立春”和“春节”。例如 2024 年立春是 2 月 4 日,但春节(正月初一)是 2 月 10 日。节气属太阳历成分,农历日期属阴阳历结果,overtrue/chinese-calendar 把两者分开提供:getSolarTerm() 返回节气名(如 '立春'),getLunarDate() 返回农历日序(如 '正月初一')。
真正难处理的是“无中气月”判定——这决定了哪个月是闰月,而该逻辑已封装在包内部,调用者只需信任返回值,不必碰底层天文计算。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











