lunar-calendar-plus
Version:
lunar-calendar-plus是一个可自定义设置假期、节日;获取指定农历日期、节气、每日宜忌、天文历等灵活的js库。支持Typescript!
232 lines (211 loc) • 6.04 kB
JavaScript
"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;