php8无内置农历转换功能,需依赖overtrue/chinese-calendar库实现公农历互转、节气查询等;该库支持php8、适配jit与严格类型,避免自制类的闰月错误与时区偏差。

PHP8 没有内置农历转换函数
PHP 标准库(包括 PHP8)完全不提供农历(阴历、黄历)与公历之间的互转能力。DateTime、date()、IntlDateFormatter 全部只处理格里高利历(公历)。想用原生 PHP8 做农历转换,直接写逻辑不可行——闰月规则、节气计算、干支纪年、生肖推算等涉及复杂天文算法,不是简单查表能解决的。
推荐用 overtrue/chinese-calendar 库
这是目前 PHP 生态中最稳定、更新最勤、文档最清晰的农历处理库,支持 PHP7.4+(含 PHP8),已适配 JIT 和严格类型。安装后可直接做公历→农历、农历→公历、节气查询、生肖/干支推算等:
composer require overtrue/chinese-calendar
基本用法示例:
$calendar = new \Overtrue\ChineseCalendar\Calendar(); // 公历转农历:2025-01-29 → 农历甲辰年正月初一 $lunar = $calendar->solarToLunar(2025, 1, 29); echo $lunar['lunarYear']; // 2024(注意:农历年份按春节划界,1月29日属甲辰年,但农历年份值为2024) echo $lunar['lunarMonth']; // 1 echo $lunar['lunarDay']; // 1
注意事项:
-
solarToLunar()返回的lunarYear是农历年份数字(如 2024),不是干支年;需调用getYearGanZhi()单独获取“甲辰” - 农历日期中“闰月”用负数表示,例如闰四月是
-4,读取时需判断$lunar['lunarMonth'] - 该库默认按北京时间(UTC+8)计算节气,若部署在海外服务器且未设时区,可能造成节气时间偏差,建议显式设置:
date_default_timezone_set('Asia/Shanghai');
避免用过时或不可靠的“自制农历类”
网上大量 PHP 农历代码基于 1990–2030 年简表硬编码,或套用错误的闰周规则(如固定 19 年 7 闰但忽略定气法),在 PHP8 下常因严格类型报错(如 strlen(null))、时区处理混乱、无法识别 2031 年后闰月等问题。典型症状包括:
- 2025 年春节(1月29日)被算成腊月三十
- 调用
lunarToSolar(2024, 12, 30)返回空数组或致命错误 - 对含节气的日期(如春分当日)返回错误农历日序
这些类通常没有单元测试,也不维护,PHP8.1+ 的 ReturnTypeWillChange 提示或 JIT 优化下更容易崩。别省那几十行代码,用成熟库更省调试时间。
需要节气或八字排盘就得另加工具
overtrue/chinese-calendar 支持二十四节气日期和时刻(精确到分钟),但不提供八字(年柱、月柱、日柱、时柱)自动排盘——因为“真太阳时”校正、节气交界时刻的时辰划分、以及“五鼠遁”等口诀需结合具体出生经纬度和时间,超出了通用日历库范围。如果业务真要算八字:
- 节气数据可从该库的
getSolarTerms()获取 - 日柱可用其
getGanZhi()方法(已内置蔡勒公式修正) - 时柱必须自己实现“真太阳时”换算,或调用地理坐标 API(如 OpenCage)补全经度,再套用地方平时公式
这类需求已超出日历转换本身,属于命理计算范畴,PHP 不是合适载体;建议把核心逻辑移至 Python(用 ephem 或 skyfield)或专用天文库,PHP 只做接口胶水。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











