js 实现农历
实现农历转换的方法
使用现成的库
Lunar.js 或 chinese-lunar 是常用的 JavaScript 农历转换库。安装后可直接调用 API 实现公历到农历的转换。

// 使用 chinese-lunar 示例
const lunar = require('chinese-lunar');
const solarDate = new Date(2023, 10, 1);
const lunarDate = lunar.solarToLunar(solarDate);
console.log(lunarDate.year, lunarDate.month, lunarDate.day);
手动计算算法
基于公历日期计算农历需要处理闰月、节气等复杂规则。以下是一个简化版的实现逻辑:

function getLunarDate(year, month, day) {
// 农历年份计算(以春节为界)
const springFestival = getSpringFestival(year);
const isBeforeSpring = new Date(year, month - 1, day) < springFestival;
const lunarYear = isBeforeSpring ? year - 1 : year;
// 计算农历月份和日(需预置农历数据表)
const lunarData = getLunarData(lunarYear);
let daysPassed = Math.floor((new Date(year, month - 1, day) - springFestival) / 86400000);
// 遍历月份数据匹配当前日期
for (let m = 0; m < lunarData.months.length; m++) {
if (daysPassed < lunarData.months[m].days) {
return {
year: lunarYear,
month: m + 1,
day: daysPassed + 1,
isLeap: lunarData.months[m].isLeap
};
}
daysPassed -= lunarData.months[m].days;
}
}
关键数据表
实现完整农历需预置以下数据:
- 1900-2100 年的农历每月天数及闰月信息
- 每年春节的公历日期
- 二十四节气时间表
// 示例数据片段
const LUNAR_DATA = {
2023: {
springFestival: new Date(2023, 0, 22),
months: [
{ days: 29, isLeap: false },
{ days: 30, isLeap: false },
// ...其他月份数据
],
leapMonth: 2 // 闰二月
}
};
注意事项
- 农历转换涉及复杂天文历法,建议优先使用成熟库
- 手动实现需处理大量边界条件(如闰月、跨年)
- 节气计算需引入太阳黄经算法
- 不同地区的农历习俗可能略有差异
扩展功能
完整的农历实现通常还包括:
- 干支纪年计算
- 生肖年份转换
- 节气时间计算
- 传统节日判定(如端午节、中秋节)
- 黄历宜忌信息






