lunar-calendar-plus
Version:
lunar-calendar-plus是一个可自定义设置假期、节日;获取指定农历日期、节气、每日宜忌、天文历等灵活的js库。支持Typescript!
273 lines (252 loc) • 5.52 kB
JavaScript
;
const termModule = new Array(
0,
21208,
42467,
63836,
85337,
107014,
128867,
150921,
173149,
195551,
218072,
240693,
263343,
285989,
308563,
331033,
353350,
375494,
397447,
419210,
440795,
462224,
483532,
504758
);
const termData = new Array(
"小寒",
"大寒",
"立春",
"雨水",
"惊蛰",
"春分",
"清明",
"谷雨",
"立夏",
"小满",
"芒种",
"夏至",
"小暑",
"大暑",
"立秋",
"处暑",
"白露",
"秋分",
"寒露",
"霜降",
"立冬",
"小雪",
"大雪",
"冬至"
);
const Tian = new Array(
"甲",
"乙",
"丙",
"丁",
"戊",
"己",
"庚",
"辛",
"壬",
"癸"
);
const Zhi = new Array(
"子",
"丑",
"寅",
"卯",
"辰",
"巳",
"午",
"未",
"申",
"酉",
"戌",
"亥"
);
const signData = new Array(
"建",
"除",
"满",
"平",
"定",
"执",
"破",
"危",
"成",
"收",
"开",
"闭"
);
const signSuitable = new Array(
"出行.上任.会友.上书.见工",
"除服.疗病.出行.拆卸.入宅",
"祈福.祭祀.结亲.开市.交易",
"祭祀.修坟.涂泥.余事勿取",
"交易.立券.会友.签约.纳畜",
"祈福.祭祀.求子.结婚.立约",
"求医.赴考.祭祀.余事勿取",
"经营.交易.求官.纳畜.动土",
"祈福.入学.开市.求医.成服",
"祭祀.求财.签约.嫁娶.订盟",
"疗病.结婚.交易.入仓.求职",
"祭祀.交易.收财.安葬"
);
const signTaboo = new Array(
"动土.开仓.嫁娶.纳采",
"求官.上任.开张.搬家.探病",
"服药.求医.栽种.动土.迁移",
"移徙.入宅.嫁娶.开市.安葬",
"种植.置业.卖田.掘井.造船",
"开市.交易.搬家.远行",
"动土.出行.移徙.开市.修造",
"登高.行船.安床.入宅.博彩",
"词讼.安门.移徙",
"开市.安床.安葬.入宅.破土",
"安葬.动土.针灸",
"宴会.安床.出行.嫁娶.移徙"
);
const eclipticSuitable = new Array();
const eclipticTaboo = new Array();
function solarTerm() {}
/**
* 获取节气句柄
* @param {Number} y
* @param {Number} n
*/
solarTerm.prototype.getTermHandle = function (y, n) {
var offDate = new Date(
31556925974.7 * (y - 1900) +
termModule[n] * 60000 +
Date.UTC(1900, 0, 6, 2, 5)
);
return offDate.getUTCDate();
};
/**
* 获取指定月份节气日
* @param {Number} y
* @param {Number} m
*/
solarTerm.prototype.getTermDay = function (y, m) {
return new Array(
this.getTermHandle(y, m * 2),
this.getTermHandle(y, m * 2 + 1)
);
};
/**
* 获取指定月份节气
* @param {Number} y
* @param {Number} m
* @param {Number} d
*/
solarTerm.prototype.getTerm = function (y, m, d) {
var existTerm = this.getTermDay(y, m).indexOf(d);
return existTerm < 0 ? undefined : termData[2 * m + existTerm];
};
/**
* 年、月、日柱句柄
* @param {Number|Object} y
* @param {String} type 类型(年--y|月--m|日--d)
*/
solarTerm.prototype.tgHandle = function (date, type) {
var calTian = -1;
var calZhi = -1;
if (type == "y") {
calTian = (date - 3) % 10;
calZhi = (date - 3) % 12;
} else {
var calI = 0;
// 每月第一个"节气"变化月支
if (type == "m") {
var TermDay = this.getTermDay(date.y, date.m);
calI = date.d >= TermDay[0] ? 13 : 12;
calTian = (date.y - 1900) * 12 + date.m + calI;
calZhi = (date.y - 1900) * 12 + date.m + calI;
} else {
calI = Date.UTC(date.y, date.m, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10;
calTian = calI + date.d - 1;
calZhi = calI + date.d - 1;
}
calTian = calTian % 10;
calZhi = calZhi % 12;
}
return {
Tian: calTian,
Zhi: calZhi,
};
};
/**
* 年柱
* 按农历计算
* @param {Number} y
*/
solarTerm.prototype.tzYear = function (y) {
var tzHandle = this.tgHandle(y, "y");
return {
Tian: Tian[tzHandle.Tian - 1],
TianNum: tzHandle.Tian - 1,
Zhi: Zhi[tzHandle.Zhi - 1],
ZhiNum: tzHandle.Zhi - 1,
};
};
/**
* 月柱
* @param {Number} y
* @param {Number} m
*/
solarTerm.prototype.tzMonth = function (y, m, d) {
var tzHandle = this.tgHandle({ y, m, d }, "m");
return {
Tian: Tian[tzHandle.Tian],
TianNum: tzHandle.Tian,
Zhi: Zhi[tzHandle.Zhi],
ZhiNum: tzHandle.Zhi,
};
};
/**
* 日柱
* @param {Number} y
* @param {Number} m
* @param {Number} d
*/
solarTerm.prototype.tzDay = function (y, m, d) {
var tzHandle = this.tgHandle({ y, m: m - 1, d }, "d");
return {
Tian: Tian[tzHandle.Tian],
TianNum: tzHandle.Tian,
Zhi: Zhi[tzHandle.Zhi],
ZhiNum: tzHandle.Zhi,
};
};
/**
* 建除十二神
* @param {Number} tzYear 年柱
* @param {Number} tzMonth 月柱
* @param {Number} tzDay 日柱
*/
solarTerm.prototype.sign = function (tzYear, tzMonth, tzDay) {
var signMonthNum = tzDay - tzMonth;
var signYearNum = tzDay - tzYear;
if (Math.abs(signMonthNum) == 6 || Math.abs(signYearNum) == 6) {
// 地支相冲
console.log("地支相冲,大事勿用");
return;
}
var signIndex =
signMonthNum < 0 ? signData.length - Math.abs(signMonthNum) : signMonthNum;
console.log(signSuitable[signIndex], signTaboo[signIndex]);
};
module.exports = solarTerm;