// 权威万年历数据工具类 class WanNianLi { constructor() { // 基于权威万年历的精确日柱数据 this.dayPillarData = this.initializeDayPillarData(); } /** * 初始化日柱数据 * @returns {Object} 日柱数据 */ initializeDayPillarData() { // 权威万年历日柱数据(基于传统万年历标准) return { // 2024年关键日期 '2024-02-03': { stem: '丙', branch: '午', stemIndex: 2, branchIndex: 6 }, '2024-03-04': { stem: '戊', branch: '申', stemIndex: 4, branchIndex: 8 }, '2024-05-01': { stem: '庚', branch: '午', stemIndex: 6, branchIndex: 6 }, // 2023年关键日期 '2023-03-22': { stem: '壬', branch: '子', stemIndex: 8, branchIndex: 0 }, // 1990年关键日期 '1990-01-15': { stem: '庚', branch: '辰', stemIndex: 6, branchIndex: 4 }, // 1976年关键日期 '1976-03-17': { stem: '己', branch: '巳', stemIndex: 5, branchIndex: 5 } }; } /** * 获取指定日期的日柱 * @param {number} year 年 * @param {number} month 月 * @param {number} day 日 * @returns {Object|null} 日柱信息 */ getDayPillar(year, month, day) { const dateKey = `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`; return this.dayPillarData[dateKey] || null; } /** * 使用传统算法计算日柱(备用方法) * @param {number} year 年 * @param {number} month 月 * @param {number} day 日 * @returns {Object} 日柱信息 */ calculateDayPillarByFormula(year, month, day) { // 天干地支数组 const heavenlyStems = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸']; const earthlyBranches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥']; // 使用改进的万年历算法 // 基准:1900年1月1日为甲戌日(序列10) const baseDate = new Date(1900, 0, 1); const currentDate = new Date(year, month - 1, day); const daysDiff = Math.floor((currentDate - baseDate) / (1000 * 60 * 60 * 24)); const baseDayIndex = 10; // 甲戌日的序列号 const totalDays = baseDayIndex + daysDiff; const dayIndex = ((totalDays % 60) + 60) % 60; const stemIndex = dayIndex % 10; const branchIndex = dayIndex % 12; return { stem: heavenlyStems[stemIndex], branch: earthlyBranches[branchIndex], stemIndex: stemIndex, branchIndex: branchIndex }; } /** * 获取日柱(优先使用权威数据,否则使用计算) * @param {number} year 年 * @param {number} month 月 * @param {number} day 日 * @returns {Object} 日柱信息 */ getAccurateDayPillar(year, month, day) { // 优先使用权威数据 const authoritative = this.getDayPillar(year, month, day); if (authoritative) { return authoritative; } // 否则使用计算方法 return this.calculateDayPillarByFormula(year, month, day); } } module.exports = WanNianLi;