js实现节气
节气计算方法
节气计算通常基于太阳黄经角度,可通过以下步骤实现:

-
确定太阳黄经
每个节气对应固定的黄经角度(如春分为0°,冬至为270°)。公式如下:
[ \lambda = (节气序号 \times 15°) \mod 360° ]
其中节气序号从春分(0)开始递增。
-
计算儒略日(Julian Day)
儒略日是天文计算的基础,公历转儒略日的公式为:
[ JD = \lfloor 365.25 \times (Y + 4716) \rfloor + \lfloor 30.6001 \times (M + 1) \rfloor + D + B - 1524.5 ]- (Y)为年份,(M)为月份,(D)为日期;
- (B)为格里高利历修正值(1582年10月15日后适用)。
-
迭代求解节气时刻
使用牛顿迭代法逼近节气对应的儒略日:- 初始估计:基于平均节气间隔(约15.2天);
- 修正值:根据太阳黄经与目标角度的差值调整。
JavaScript 实现代码
// 计算儒略日
function julianDay(year, month, day) {
if (month <= 2) {
year -= 1;
month += 12;
}
const A = Math.floor(year / 100);
const B = 2 - A + Math.floor(A / 4);
return Math.floor(365.25 * (year + 4716)) + Math.floor(30.6001 * (month + 1)) + day + B - 1524.5;
}
// 计算太阳黄经(简化模型)
function solarLongitude(jd) {
const T = (jd - 2451545.0) / 36525;
const L0 = 280.46645 + 36000.76983 * T;
const M = 357.52910 + 35999.05030 * T;
const C = (1.914600 - 0.004817 * T) * Math.sin(M * Math.PI / 180);
return (L0 + C) % 360;
}
// 计算节气(示例:春分)
function findSolarTerm(year, targetAngle) {
let jd = julianDay(year, 3, 20); // 初始估计
for (let i = 0; i < 10; i++) { // 迭代10次
const lambda = solarLongitude(jd);
const delta = (lambda - targetAngle + 360) % 360;
jd -= delta / 360 * 365.25; // 粗略修正
}
return new Date((jd - 2440587.5) * 86400000); // 转UTC时间
}
// 示例:计算2023年春分(黄经0°)
const springEquinox = findSolarTerm(2023, 0);
console.log(springEquinox.toLocaleString());
节气名称与黄经对照表
| 节气 | 黄经角度 |
|---|---|
| 春分 | 0° |
| 清明 | 15° |
| 立夏 | 45° |
| 夏至 | 90° |
| ... | ... |
注意事项
- 精度问题
简化模型误差约±1天,高精度需引入光行差、章动等修正。 - 时区处理
返回结果为UTC时间,需根据本地时区调整。 - 性能优化
频繁计算时可预生成节气表缓存。
如需完整24节气实现,可扩展solarLongitude函数并添加节气名称映射。






