PHP7无内置黄历函数,需用overtrue/chinese-calendar类库实现农历转换(含节气、干支、生肖),宜忌须另配经校验的查表数据,不可计算得出。

PHP7 没有内置黄历函数,必须依赖外部数据源
PHP7 标准库不提供节气、宜忌、干支、生肖等黄历信息,date() 和 DateTime 只能处理公历。想拿到“今天宜嫁娶”或“农历四月廿三”,得自己接入农历转换逻辑或调用现成接口。
用 ChinaCalendar 类库做本地农历转换(推荐轻量方案)
GitHub 上较稳定的 PHP 农历类是 overtrue/chinese-calendar(支持 PHP7.1+,但 PHP7.0 也能跑)。它不联网,纯算法计算,适合离线场景,但不包含宜忌——只转农历日期、节气、干支、生肖、二十四节气时间点。
安装:
composer require overtrue/chinese-calendar
基本用法:
$date = new \Overtrue\ChineseCalendar\Calendar('2024-05-15');<br>echo $date->lunar()->year(); // 2024<br>echo $date->lunar()->month(); // 4<br>echo $date->lunar()->day(); // 28<br>echo $date->lunar()->ganzhiYear(); // 甲辰
立即学习“PHP免费学习笔记(深入)”;
注意点:
- 该库默认按东八区时间计算,若服务器时区非
Asia/Shanghai,需先设date_default_timezone_set('Asia/Shanghai') - 节气时间返回的是
DateTime对象,不是字符串,直接 echo 会输出 ISO 格式,需用format() - 不提供“今日宜忌”,要这部分得另配宜忌表(见下条)
宜忌数据必须查表,不能算出来
黄历中的“忌开市”“宜纳采”没有数学公式,是历史积累的民俗规则,所有 PHP 实现都靠查预置数组。常见做法:
- 用 JSON 或 PHP 数组存 1900–2100 年每日宜忌(约 7 万行),按
Ymd键索引 - 从公开 API(如聚合数据、心知天气)拉取,但有调用频次和 HTTPS 依赖
- 把宜忌字段硬编码进
overtrue/chinese-calendar的扩展类里(需自行维护)
示例查表逻辑:
$yi_ji_data = include 'yiji.php'; // 返回 ['20240515' => ['yi' => ['嫁娶','订盟'], 'ji' => ['开市','动土']]]<br>$key = date('Ymd');<br>if (isset($yi_ji_data[$key])) {<br> $yi = implode('、', $yi_ji_data[$key]['yi']);<br>}
风险提示:
- 网上流传的宜忌 JSON 多数未标注来源,准确性难验证
- 不同流派(如通书 vs 民国老黄历)宜忌可能冲突
- PHP 数组加载全量数据会占几 MB 内存,高频请求建议用 Redis 缓存键值
别信“一行代码获取黄历”的封装包
搜索 “php 黄历 composer” 会出现一些所谓“一键黄历”包,实际只是把 overtrue/chinese-calendar + 一份未经校验的宜忌 CSV 封装了下,版本停更、无测试、不修 bug。你调用的 getHuangLiToday() 底层仍是那套算法 + 静态表,没魔法。
真正要稳,就两件事:
- 农历部分用
overtrue/chinese-calendar(确认其 lunar 算法与紫金山天文台《中国天文年历》一致) - 宜忌部分明确数据来源,自己定期核对或留更新入口
节气交节时刻误差超过 2 分钟、农历闰月错一个月,这种问题在 PHP7 下不会自动修复——得看算法实现是否修正了 1929 年以来的朔望月精度模型。



















