UNPKG

lunar-calendar-plus

Version:

lunar-calendar-plus是一个可自定义设置假期、节日;获取指定农历日期、节气、每日宜忌、天文历等灵活的js库。支持Typescript!

232 lines (211 loc) 6.04 kB
"use strict"; // Core 核心类 var lunarDay = require("./core/lunarDay"); var lunarYear = require("./core/lunarYear"); var solarTerm = require("./core/solarTerm"); var festival = require("./core/festival"); // Tool 工具类 var baseDate = require("./helper/baseDate"); const maxYear = 2100; const minYear = 1900; const ChineseZodiac = new Array( "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" ); /** * 解析校验参数 * @param {Object|String} data */ function parseData(yearParm, monthParm, dayParm) { var year, month, day; if (yearParm instanceof Date) { monthParm = dayParm = null; year = yearParm.getFullYear(); month = yearParm.getMonth() + 1; day = yearParm.getDate(); } else { year = yearParm; month = monthParm; day = dayParm; } if (year > maxYear || year < minYear) { throw new Error("cannot be greater than 2100 and less than 1900"); } return { year: year, month: month, day: day }; } function calendar(y, m, d) { var newData = parseData(y, m, d); this.year = newData.year; this.month = newData.month; this.day = newData.day; } /** * 获取所有数据 * @param {Number|Object} y * @param {Number} m * @param {Number} d */ calendar.prototype.getAll = function (y, m, d) { // 公历 var newData = parseData(y || this.year, m || this.month, d || this.day); var day = baseDate.getDay(newData.month - 1); // 农历 var lunarMonth = this.getMonth(y, m); for (var e = 1; e <= day; e++) { var lu = e - 1; lunarMonth[lu]["greYear"] = newData.year; lunarMonth[lu]["greMonth"] = newData.month; lunarMonth[lu]["greDay"] = e; lunarMonth[lu]["term"] = this.getTerm(newData.year, newData.month, e); var tz = this.getTZ(newData.year, newData.month, e); lunarMonth[lu]["tz"] = { year: tz["year"]["Tian"] + tz["year"]["Zhi"], month: tz["month"]["Tian"] + tz["month"]["Zhi"], day: tz["day"]["Tian"] + tz["day"]["Zhi"], }; lunarMonth[lu]["sings"] = this.getSigns(newData.year); lunarMonth[lu]["lunarFestival"] = this.festivalInstance.lunarFestival( lunarMonth[lu].month, lunarMonth[lu].day ); lunarMonth[lu]["gerFestival"] = this.festivalInstance.gerFestival( newData.month, e ); } return lunarMonth; }; /** * 设置节日 * @param {Object} data * @param {Boolean} type */ calendar.prototype.setFestival = function (data, type) { if ( baseDate.getType(data, "Object") < 0 || baseDate.getType(type, "Boolean") < 0 ) { throw new Error("data must be Object And type must be Boolean"); } this.festivalInstance.setFestival(data, type); }; /** * 获取节日 * @param {Object} data * @param {Boolean} type */ calendar.prototype.getFestival = function (m, d) { return this.festivalInstance.dayFestival(m, d); }; /** * 获取节气 * @param {Number} year * @param {Number} month */ calendar.prototype.getTerm = function (y, m, d) { var newData = parseData(y || this.year, m || this.month, d || this.day); return this.termInstance.getTerm( newData.year, newData.month - 1, newData.day ); }; /** * 十二生肖 * @param {Number|Object} y */ calendar.prototype.getSigns = function (y) { var newData = parseData(y || this.year); var singIndex = newData.year % 12; return ChineseZodiac[(singIndex + 8) % 12]; }; /** * 天干 * @param {Number|Object} y * @param {Number} m * @param {Number} d */ calendar.prototype.getTZ = function (y, m, d) { var newData = parseData(y || this.year, m || this.month, d || this.day); // 阳历 var year = newData.year ? this.termInstance.tzYear(newData.year) : null; var month = newData.day && newData.month && newData.year ? this.termInstance.tzMonth(newData.year, newData.month) : null; var day = newData.day && newData.month && newData.year ? this.termInstance.tzDay(newData.year, newData.month, newData.day) : null; return { year, month, day }; }; /** * 获取农历月份 * @param {Number} m month */ calendar.prototype.getMonth = function (y, m) { var newData = parseData(y || this.year, m || this.month); var day = baseDate.getDay(newData.month - 1), month = newData.month - 1; var leapObj = {}, returnObj = []; // 缓存 var changeDay = 1; var baseDay = 0; for (var i = 1; i <= day; i++) { /** 每次月初重新计算 */ if (changeDay > baseDay) { leapObj = this.lunarDayInstance.calDay(new Date(newData.year, month, i)); baseDay = this.lunarDayInstance.yearCache[leapObj["year"]].isLeap && this.lunarDayInstance.yearCache[leapObj["year"]].leapMonth == leapObj["month"] ? this.lunarDayInstance.yearCache[leapObj["year"]].day : this.lunarYearInstance.getMonthDay( leapObj["year"], leapObj["month"] ); changeDay = leapObj.day; } var lo = JSON.parse(JSON.stringify(leapObj)); lo["day"] = changeDay++; returnObj.push(lo); } return returnObj; }; /** * 获取农历天数 * @param {*} y * @param {*} m * @param {*} d */ calendar.prototype.getDay = function (y, m, d) { var newData = parseData(y || this.year, m || this.month, d || this.day); return this.lunarDayInstance.calDay( new Date(newData.year, newData.month - 1, newData.day) ); }; /** * 获取整年每月农历 * @param {*} y * @param {*} m * @param {*} d */ calendar.prototype.getYear = function (y, m, d) {}; calendar.prototype.lunarYearInstance = new lunarYear(); calendar.prototype.lunarDayInstance = new lunarDay( calendar.prototype.lunarYearInstance ); calendar.prototype.termInstance = new solarTerm(); calendar.prototype.festivalInstance = new festival({}); module.exports = calendar;