php8无内置节气函数,需用overtrue/chinese-calendar库实现;其基于紫金山天文台算法,支持精确到分钟的节气计算,自行实现易因时区、精度等问题出错。

PHP8 中没有内置节气计算函数
PHP 标准库不提供 getSolarTerm() 或类似接口,节气是基于太阳黄经的天文计算,不是简单日历换算。直接用 date() 或 DateTime 无法得出准确结果。
推荐用第三方库 overtrue/chinese-calendar
它支持 PHP8,封装了完整的二十四节气计算逻辑(基于紫金山天文台算法),且已处理闰年、时区、农历转换等细节。安装方式:
composer require overtrue/chinese-calendar
基本用法示例:
$date = new DateTime('2024-03-20');
$calendar = new \Overtrue\ChineseCalendar\Calendar($date);
echo $calendar->solarTerm(); // 输出:春分
注意:solarTerm() 返回的是节气名称字符串,若当天无节气(绝大多数日期),返回空字符串。
自己实现需谨慎对待精度和时区
若坚持手写,核心是根据公历日期反推太阳黄经,再比对 213.75°、225°… 等 24 个黄经点。但存在几个硬伤:
-
date_default_timezone_set('Asia/Shanghai')必须显式设置,否则黄经计算会偏移(节气时刻以东八区为准) - 简单近似公式(如“每年 3 月 20 日左右春分”)在 2024–2043 年误差可达 ±1 天,2033 年春分实际是 3 月 20 日 11:06,而粗略算法可能判为 3 月 19 日
- PHP8 的
gmp或bcmath扩展不是必须,但高精度三角函数(sin/cos)输入单位必须是弧度,且需保留至少 10 位小数才勉强够用
节气时间点比节气名称更难获取
多数场景只需要知道“某天是否为节气日”,但若需精确到分钟(例如“2024 年冬至是 12 月 21 日 17:20”),overtrue/chinese-calendar 的 getSolarTermsOfYear(2024) 可返回全量带时间戳的数组,每个元素含 datetime 字段(DateTime 实例)。自行实现时,务必用 DateTimeZone::UTC 先算出 UTC 时间,再转东八区——直接在本地时区做运算会导致节气时刻错误。
真正麻烦的不是算哪天,而是算几点几分;这个“点”是地球绕日轨道上的真实位置,不是日历格子。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











