php-lunar 并非真实存在的 composer 包,因其未注册于 packagist 且无官方维护,强行安装会报错;实际可用方案为 overtrue/laravel-chinese-calendar(laravel 场景)或 gaozhi/lunar(纯 php),二者均支持 composer 安装并提供可靠农历转换功能。

PHP-Lunar 不是 Composer 可直接安装的公开包,它不存在于 Packagist,强行 composer require 会报错 Package php-lunar/php-lunar not found。
为什么 Composer 找不到 php-lunar/php-lunar
PHP-Lunar 是一个长期被误传的“库名”,实际并不存在官方维护的同名 Composer 包。网上提到的所谓 “PHP-Lunar” 多指以下两类情况:
- 某个人 fork 或私有仓库里改写的农历转换逻辑(无统一命名、无 Packagist 注册)
- 对 Python 的
lunardate或 Java 的ChineseCalendar的误称移植 - 部分中文博客把自写函数或旧版
calendars类库硬贴上该标签
可用的替代方案:使用 overtrue/laravel-chinese-calendar(Laravel 场景)
这是目前最接近需求、稳定维护、支持 Composer 安装的中文农历工具库,底层基于权威农历算法(含节气、闰月校验),适用于 Laravel 项目,也支持纯 PHP 使用。
执行安装命令:
composer require overtrue/laravel-chinese-calendar
基础用法示例:
$calendar = new \Overtrue\ChineseCalendar\Calendar(); // 阳历转阴历 $lunar = $calendar->solarToLunar(2024, 10, 1); // 返回 ['year'=>2024, 'month'=>8, 'day'=>28, 'leap'=>false, ...] // 阴历转阳历 $solar = $calendar->lunarToSolar(2024, 8, 28, false); // 返回 ['year'=>2024, 'month'=>10, 'day'=>1]
注意点:
- 该库默认只支持 1900–2100 年区间,超出会返回
null - 阴历日期中的
leap参数必须明确传true或false,否则可能误判闰月 - 不支持时辰级精度(即无法精确到几点几分),仅到日粒度
纯 PHP 项目用 gaozhi/lunar(轻量无框架依赖)
这是一个专注农历计算、无外部依赖、可直接 require 的单文件方案,已发布在 Packagist,兼容 PHP 7.4+:
composer require gaozhi/lunar
调用方式极简:
use Gaozhi\Lunar\Lunar;
$lunar = new Lunar();
echo $lunar->dateToLunar('2024-10-01'); // "二〇二四年八月廿八"
echo $lunar->lunarToDate('二〇二四年八月廿八'); // "2024-10-01"
关键限制:
- 字符串输入格式严格:
dateToLunar()要求Y-m-d;lunarToDate()要求带中文数字和“年/月/日”结构 - 不提供数组结构化返回,结果为格式化字符串,需自行
preg_match提取年月日 - 节气信息未暴露为独立接口,如需立春、冬至等需另查表或扩展
自己封装时最容易忽略的三个细节
若你决定基于农历算法自研或封装,以下三点几乎必然出错:
- 农历“正月初一”不是固定阳历日期——它由天文朔日(新月时刻)决定,需查《紫金历》或中科院紫台数据,不能简单用“1月21–2月20”估算
- 闰月处理必须结合当年闰几月 + 该月是否为闰月双重判断,漏掉任一条件会导致后续月份全部偏移
- PHP 的
strtotime()和DateTime默认按公历解析,传入“二〇二四年八月廿八”会直接失败,必须先做字符串规整再进算法
真正可靠的农历转换,核心不在代码行数,而在所用天文常数和闰周规则是否与最新《农历编算规范》一致。别信“几百行搞定阴阳历”的说法——光是 1900–2100 年间闰月分布表就得嵌入 40+ 条硬编码规则。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











