UNPKG

lunar-calendar-plus

Version:

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

273 lines (252 loc) 5.52 kB
"use strict"; 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;