Files
2022-07-06 17:30:16 +08:00

2493 lines
80 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>奇门遁甲起局</title>
</head>
<body>
<script type="text/javascript">
// 拆补无闰法起局
function flutterCallPaiPan(yy, mm, dd, hh, m) {
let ccc = {};
ccc = calcJuNum(yy, mm, dd, hh, m, 0);
return JSON.stringify(ccc);
}
// 阴盘起局
function flutterCallYinPan(yy, mm, dd, hh, m) {
let ccc = {};
ccc = calYinPan(yy, mm, dd, hh, m, 0);
return JSON.stringify(ccc);
}
// 计算农历日期
function flutterCallLunar(yy, mm, dd) {
let abc = {};
console.log('come in flutterCallLunar');
abc = calendar.solar2lunar(yy, mm, dd);
return JSON.stringify(abc);
}
// 计算公历日期
function flutterCallSolar(yy, mm, dd) {
let abc = {};
console.log('come in flutterCallSolar');
abc = calendar.lunar2solar(yy, mm, dd);
return JSON.stringify(abc);
}
// 计算阴盘
function calYinPan(yy, mm, dd, h, m, s) {
let calResult = {};
var jtoday =
date_to_julian_day2(yy, mm, dd) + date_to_julian_time(h, m, s);
var jiqi = new JiQi();
var jqTime = new Array();
jiqi.GetPureJQsinceSpring2(yy, 0, 0, 0, jqTime);
if (jtoday < jqTime[0]) {
jiqi.GetPureJQsinceSpring2(yy - 1, 0, 0, 0, jqTime); // 计算上一年节气(以立春日為新一年)
}
var jqpos = 0; // 计算当前节气
for (var ii = 1; ii < 25; ii++) {
if (jtoday < jqTime[ii]) {
// 输出当前节气
calResult.jieqi = jiqi.jq0[ii - 1];
// console.log(jiqi.Jtime(false, jqTime[ii - 1]))
jqpos = ii - 1;
break;
}
}
// 起四柱
//var fcol = jiqi.GetGZ(d.getFullYear(),d.getMonth()+1,d.getDate(),d.getHours(), d.getMinutes(), d.getSeconds());
var fcol = jiqi.GetGZ(yy, mm, dd, h, m, s, 0);
// 排四柱
var tcol0 = new Array();
var dcol0 = new Array();
for (var i = 6; i > -1; i -= 2) tcol0.push(fcol[i]);
for (var i = 7; i > -1; i -= 2) dcol0.push(fcol[i]);
// 年支 时支
var yearDz = '子丑寅卯辰巳午未申酉戌亥'.indexOf(fcol[1]);
var timeDz = '子丑寅卯辰巳午未申酉戌亥'.indexOf(fcol[7]);
var res = calendar.lunar2solar(yy, mm, dd);
var ml = res.lMonth;
var dl = res.lDay;
var using_kook = (yearDz + timeDz + ml + dl + 3) % 9;
// 计算阴遁或阳遁
// 阴盘局数:(年地支序数+农历月+农历日+时地支序数) mod 9
var dun_type = 2; // 0為阴遁, 1為阳遁, 其餘為錯誤
if (jtoday > jqTime[9] && jtoday < jqTime[21]) {
// 阴遁
dun_type = 0;
} else {
// 阳遁
dun_type = 1;
}
console.log('using_kook', using_kook);
// todo: 遁局
calResult.dunju =
'阴阳'.charAt(dun_type) +
'遁' +
' 一二三四五六七八九'.charAt(using_kook) +
'局';
// console.log("阴阳".charAt(dun_type) + "遁" + " 一二三四五六七八九".charAt(using_kook) + "局");
/** 重計時旬首 **/
// 時旬首
var chun_sau =
'子丑寅卯辰巳午未申酉戌亥'.indexOf(dcol0[0]) -
'甲乙丙丁戊己庚辛壬癸'.indexOf(tcol0[0]);
if (chun_sau < 0) chun_sau += 12;
// 建地盘
var dei_pan = ''; // 建地盘
if (dun_type == 1) {
// 阳遁
//var dei_pan = " 戊己庚辛壬癸丁丙乙戊己庚辛壬癸丁丙乙".substr(9-using_kook+1,9); // 地盘
var dei_pan = '戊己庚辛壬癸丁丙乙戊己庚辛壬癸丁丙乙'.substr(
9 - using_kook + 1,
9
); // 地盘
} else {
// 阴遁
//var dei_pan = " 戊乙丙丁癸壬辛庚己戊乙丙丁癸壬辛庚己".substr(9-using_kook+1,9);
var dei_pan = '戊乙丙丁癸壬辛庚己戊乙丙丁癸壬辛庚己'.substr(
9 - using_kook + 1,
9
);
}
// console.log(dei_pan);
// 找值符
var chun_sau = ' 子戌申午辰寅'.indexOf(
'子寅辰午申戌'.charAt(parseInt(chun_sau / 2))
);
var jik_fu_idx = 0;
var jik_fu_star = 0;
var _tmp = tcol0[0];
if (dun_type == 1) {
// 阳遁
var jik_fu_idx = using_kook + chun_sau - 1;
while (jik_fu_idx > 9) jik_fu_idx -= 9;
while (jik_fu_idx < 1) jik_fu_idx += 9;
if (_tmp == '甲') _tmp = ' 戊己庚辛壬癸'.charAt(chun_sau);
//console.log(_tmp,parseInt(chun_sau/2),chun_sau/2,chun_sau);
jik_fu_star = ' 戊己庚辛壬癸丁丙乙'.indexOf(_tmp) + using_kook - 1;
while (jik_fu_star > 9) jik_fu_star -= 9;
} else {
var jik_fu_idx = 1 + using_kook - chun_sau;
while (jik_fu_idx > 9) jik_fu_idx -= 9;
while (jik_fu_idx < 1) jik_fu_idx += 9;
//console.log(chun_sau);
if (_tmp == '甲') _tmp = ' 戊己庚辛壬癸'.charAt(chun_sau);
jik_fu_star = 1 + using_kook - ' 戊己庚辛壬癸丁丙乙'.indexOf(_tmp);
//console.log(" 戊己庚辛壬癸丁丙乙".indexOf(_tmp));
while (jik_fu_star < 1) jik_fu_star += 9;
}
// 输出值符天落x宫 -----------------------------------
if (jik_fu_star == 5) jik_fu_star = 2; // 禽星寄二宫
// todo: 值符
calResult.zhifu =
'值符天' +
',蓬芮冲辅禽心柱任英'.charAt(jik_fu_idx) +
'落' +
jik_fu_star +
'宫';
// console.log(this.zhifu);
if (jik_fu_star == 5) jik_fu_star = 2; // 禽星寄二宫
// 計值使, 不分阴阳遁
var jik_fu_mun = 0;
if (dun_type == 1) {
jik_fu_mun =
jik_fu_idx + ' 甲乙丙丁戊己庚辛壬癸'.indexOf(tcol0[0]) - 1;
while (jik_fu_mun > 9) jik_fu_mun -= 9;
} else {
jik_fu_mun =
jik_fu_idx - ' 甲乙丙丁戊己庚辛壬癸'.indexOf(tcol0[0]) + 1;
while (jik_fu_mun < 1) jik_fu_mun += 9;
}
//console.log("jik_fu_mun:",jik_fu_mun);
if (jik_fu_mun == 5) jik_fu_mun = 2; // 中宫寄坤二宫
// todo: 值使
calResult.zhishi =
'值使' +
' 休死伤杜中开惊生景'.charAt(jik_fu_idx) +
'门落' +
jik_fu_mun +
'宫';
// console.log(this.zhishi);
// 计算星盘
var houses_star_target = '18349276'.indexOf(jik_fu_star);
var houses_star_idx = '183492761834927618349276'.substr(
8 - houses_star_target + 1,
8
);
//console.log("houses_star_idx1:",houses_star_idx);
var houses_star_idx = [1, 8, 3, 4, 9, 2, 7, 6];
var _jfi = jik_fu_idx == 5 ? 2 : jik_fu_idx;
while (houses_star_idx[houses_star_target] != _jfi) {
houses_star_idx.unshift(houses_star_idx.pop());
}
var star_pan = new Array(); //星盘
for (var i = 1; i < 10; i++) {
if (i == 5) {
star_pan.push(5);
} else {
star_pan.push(houses_star_idx['18349276'.indexOf(i)]);
}
}
var houses_star = new Array();
for (var i = 0; i < 9; i++) {
houses_star.push(',蓬苪冲辅禽心柱任英'.charAt(star_pan[i]));
}
// 计算天盘
var tin_pan = new Array(); // 天盘
if (dun_type == 1) {
// 阳遁
for (var i = 0; i < 9; i++) {
var _tin = star_pan[i] - using_kook + 1;
while (_tin < 1) _tin += 9;
tin_pan.push(' 戊己庚辛壬癸丁丙乙'.charAt(_tin));
}
} else {
for (var i = 0; i < 9; i++) {
var _tin = using_kook - star_pan[i] + 1;
while (_tin < 1) _tin += 9;
tin_pan.push(' 戊己庚辛壬癸丁丙乙'.charAt(_tin));
}
}
// 计算八门
var houses_door_target = '18349276'.indexOf(jik_fu_mun);
var houses_door_idx = [1, 8, 3, 4, 9, 2, 7, 6];
//console.log("houses_door_target: ",houses_door_target);
//return;
var _jfi = jik_fu_idx == 5 ? 2 : jik_fu_idx;
while (houses_door_idx[houses_door_target] != _jfi) {
houses_door_idx.unshift(houses_door_idx.pop());
}
var door_pan = new Array(); //门盘(八门)
for (var i = 1; i < 10; i++) {
if (i == 5) {
door_pan.push(5);
} else {
door_pan.push(houses_door_idx['18349276'.indexOf(i)]);
}
}
var house_door = new Array();
for (var i = 0; i < 9; i++) {
house_door.push(',休死伤杜 开惊生景'.charAt(door_pan[i]));
}
// 计算八神
var houses_god;
if (dun_type == 1) {
// 阳遁-順排
var houses_god_target = '18349276'.indexOf(jik_fu_star);
houses_god = ['符', '蛇', '阴', '合', '白', '玄', '地', '天'];
while (houses_god[houses_god_target] != '符') {
houses_god.unshift(houses_god.pop());
}
} else {
var houses_god_target = '18349276'.indexOf(jik_fu_star);
houses_god = ['符', '天', '地', '玄', '白', '合', '阴', '蛇'];
while (houses_god[houses_god_target] != '符') {
houses_god.unshift(houses_god.pop());
}
}
var god_pan = new Array(); //神盘(八神)
for (var i = 1; i < 10; i++) {
if (i == 5) {
god_pan.push(' ');
} else {
god_pan.push(houses_god['18349276'.indexOf(i)]);
}
}
let sky = [];
let earth = [];
let star = [];
let gate = [];
let god = [];
let kong = [];
// 輸出天盘
// console.log('天盘:' + tin_pan.join(''));
sky = transPan(tin_pan);
// 輸出地盘
// console.log('地盘:' + dei_pan);
earth = transPan(dei_pan);
// 輸出星盘
// console.log('星盘:' + houses_star.join(''));
star = transPan(houses_star);
// 輸出门盘
// console.log('门盘:' + house_door.join(''));
gate = transPan(house_door);
// 輸出八神
// console.log('神盘:' + god_pan.join(''));
god = transPan(god_pan);
// 八字
let bz = '';
for (var i = 0; i < 8; i += 2) {
bz += fcol.substr(i, 2) + ' ';
}
calResult.bazi = bz;
// console.log('八字');
// console.log(this.bazi);
//時旬干
var chun_sau =
'子丑寅卯辰巳午未申酉戌亥'.indexOf(dcol0[0]) -
'甲乙丙丁戊己庚辛壬癸'.indexOf(tcol0[0]);
if (chun_sau < 0) chun_sau += 12;
var chun_gan = '甲乙丙丁戊己庚辛壬癸◯◯甲乙丙丁戊己庚辛壬癸◯◯'.substr(
12 - chun_sau,
12
);
// 输出空亡----------------------------------
calResult.kong = chun_gan.split('');
let qimenResult = [];
qimenResult = sky.map((item, index) => {
return {
sky: sky[index],
earth: earth[index],
star: star[index],
gate: gate[index],
god: god[index],
};
});
calResult.qimenResult = qimenResult;
return calResult;
}
// 计算时家奇门拆补无闰 -局数、八字、天盘、地盘、星盘、门盘、神盘
function calcJuNum(yy, mm, dd, h, m, s) {
let calResult = {};
var jtoday =
date_to_julian_day2(yy, mm, dd) + date_to_julian_time(h, m, s);
var jiqi = new JiQi();
var jqTime = new Array();
jiqi.GetPureJQsinceSpring2(yy, 0, 0, 0, jqTime);
if (jtoday < jqTime[0]) {
jiqi.GetPureJQsinceSpring2(yy - 1, 0, 0, 0, jqTime); // 计算上一年节气(以立春日為新一年)
}
var jqpos = 0; // 计算当前节气
for (var ii = 1; ii < 25; ii++) {
if (jtoday < jqTime[ii]) {
// 输出当前节气
calResult.jieqi = jiqi.jq0[ii - 1];
// console.log(jiqi.Jtime(false, jqTime[ii - 1]))
jqpos = ii - 1;
break;
}
}
// 起四柱
//var fcol = jiqi.GetGZ(d.getFullYear(),d.getMonth()+1,d.getDate(),d.getHours(), d.getMinutes(), d.getSeconds());
var fcol = jiqi.GetGZ(yy, mm, dd, h, m, s, 0);
// 排四柱
var tcol0 = new Array();
var dcol0 = new Array();
for (var i = 6; i > -1; i -= 2) tcol0.push(fcol[i]);
for (var i = 7; i > -1; i -= 2) dcol0.push(fcol[i]);
//
// 計時家奇门三元
var idx1 = '甲乙丙丁戊己庚辛壬癸'.indexOf(fcol[4]);
var idx2 = '子丑寅卯辰巳午未申酉戌亥'.indexOf(fcol[5]);
idx2 = idx2 - (idx1 % 5);
if (idx2 < 0) idx2 += 12;
idx2 = idx2 % 3;
if (idx2 > 0) {
idx2 = idx2 == 1 ? 2 : 1;
}
// 计算阴遁或阳遁
var dun_type = 2; // 0為阴遁, 1為阳遁, 其餘為錯誤
var kook = [
8, 9, 1, 3, 4, 5, 4, 5, 6, 9, 8, 7, 2, 1, 9, 7, 6, 5, 6, 5, 4, 1, 2,
3,
]; // 局數
var using_kook = kook[jqpos]; //局數
if (jtoday > jqTime[9] && jtoday < jqTime[21]) {
// 阴遁
dun_type = 0;
for (var i = 0; i < idx2; i++) {
using_kook -= 6;
while (using_kook < 1) using_kook += 9;
}
} else {
// 阳遁
dun_type = 1;
for (var i = 0; i < idx2; i++) {
using_kook += 6;
while (using_kook > 9) using_kook -= 9;
}
}
//console.log("using_kook",using_kook);
// todo: 遁局
calResult.dunju =
'阴阳'.charAt(dun_type) +
'遁' +
' 一二三四五六七八九'.charAt(using_kook) +
'局';
// console.log("阴阳".charAt(dun_type) + "遁" + " 一二三四五六七八九".charAt(using_kook) + "局");
/** 重計時旬首 **/
// 時旬首
var chun_sau =
'子丑寅卯辰巳午未申酉戌亥'.indexOf(dcol0[0]) -
'甲乙丙丁戊己庚辛壬癸'.indexOf(tcol0[0]);
if (chun_sau < 0) chun_sau += 12;
// 建地盘
var dei_pan = ''; // 建地盘
if (dun_type == 1) {
// 阳遁
//var dei_pan = " 戊己庚辛壬癸丁丙乙戊己庚辛壬癸丁丙乙".substr(9-using_kook+1,9); // 地盘
var dei_pan = '戊己庚辛壬癸丁丙乙戊己庚辛壬癸丁丙乙'.substr(
9 - using_kook + 1,
9
); // 地盘
} else {
// 阴遁
//var dei_pan = " 戊乙丙丁癸壬辛庚己戊乙丙丁癸壬辛庚己".substr(9-using_kook+1,9);
var dei_pan = '戊乙丙丁癸壬辛庚己戊乙丙丁癸壬辛庚己'.substr(
9 - using_kook + 1,
9
);
}
// console.log(dei_pan);
// 找值符
var chun_sau = ' 子戌申午辰寅'.indexOf(
'子寅辰午申戌'.charAt(parseInt(chun_sau / 2))
);
var jik_fu_idx = 0;
var jik_fu_star = 0;
var _tmp = tcol0[0];
if (dun_type == 1) {
// 阳遁
var jik_fu_idx = using_kook + chun_sau - 1;
while (jik_fu_idx > 9) jik_fu_idx -= 9;
while (jik_fu_idx < 1) jik_fu_idx += 9;
if (_tmp == '甲') _tmp = ' 戊己庚辛壬癸'.charAt(chun_sau);
//console.log(_tmp,parseInt(chun_sau/2),chun_sau/2,chun_sau);
jik_fu_star = ' 戊己庚辛壬癸丁丙乙'.indexOf(_tmp) + using_kook - 1;
while (jik_fu_star > 9) jik_fu_star -= 9;
} else {
var jik_fu_idx = 1 + using_kook - chun_sau;
while (jik_fu_idx > 9) jik_fu_idx -= 9;
while (jik_fu_idx < 1) jik_fu_idx += 9;
//console.log(chun_sau);
if (_tmp == '甲') _tmp = ' 戊己庚辛壬癸'.charAt(chun_sau);
jik_fu_star = 1 + using_kook - ' 戊己庚辛壬癸丁丙乙'.indexOf(_tmp);
//console.log(" 戊己庚辛壬癸丁丙乙".indexOf(_tmp));
while (jik_fu_star < 1) jik_fu_star += 9;
}
// 输出值符天落x宫 -----------------------------------
if (jik_fu_star == 5) jik_fu_star = 2; // 禽星寄二宫
// todo: 值符
calResult.zhifu =
'值符天' +
',蓬芮冲辅禽心柱任英'.charAt(jik_fu_idx) +
'落' +
jik_fu_star +
'宫';
// console.log(this.zhifu);
if (jik_fu_star == 5) jik_fu_star = 2; // 禽星寄二宫
// 計值使, 不分阴阳遁
var jik_fu_mun = 0;
if (dun_type == 1) {
jik_fu_mun =
jik_fu_idx + ' 甲乙丙丁戊己庚辛壬癸'.indexOf(tcol0[0]) - 1;
while (jik_fu_mun > 9) jik_fu_mun -= 9;
} else {
jik_fu_mun =
jik_fu_idx - ' 甲乙丙丁戊己庚辛壬癸'.indexOf(tcol0[0]) + 1;
while (jik_fu_mun < 1) jik_fu_mun += 9;
}
//console.log("jik_fu_mun:",jik_fu_mun);
if (jik_fu_mun == 5) jik_fu_mun = 2; // 中宫寄坤二宫
// todo: 值使
calResult.zhishi =
'值使' +
' 休死伤杜中开惊生景'.charAt(jik_fu_idx) +
'门落' +
jik_fu_mun +
'宫';
// console.log(this.zhishi);
// 计算星盘
var houses_star_target = '18349276'.indexOf(jik_fu_star);
var houses_star_idx = '183492761834927618349276'.substr(
8 - houses_star_target + 1,
8
);
//console.log("houses_star_idx1:",houses_star_idx);
var houses_star_idx = [1, 8, 3, 4, 9, 2, 7, 6];
var _jfi = jik_fu_idx == 5 ? 2 : jik_fu_idx;
while (houses_star_idx[houses_star_target] != _jfi) {
houses_star_idx.unshift(houses_star_idx.pop());
}
var star_pan = new Array(); //星盘
for (var i = 1; i < 10; i++) {
if (i == 5) {
star_pan.push(5);
} else {
star_pan.push(houses_star_idx['18349276'.indexOf(i)]);
}
}
var houses_star = new Array();
for (var i = 0; i < 9; i++) {
houses_star.push(',蓬苪冲辅禽心柱任英'.charAt(star_pan[i]));
}
// 计算天盘
var tin_pan = new Array(); // 天盘
if (dun_type == 1) {
// 阳遁
for (var i = 0; i < 9; i++) {
var _tin = star_pan[i] - using_kook + 1;
while (_tin < 1) _tin += 9;
tin_pan.push(' 戊己庚辛壬癸丁丙乙'.charAt(_tin));
}
} else {
for (var i = 0; i < 9; i++) {
var _tin = using_kook - star_pan[i] + 1;
while (_tin < 1) _tin += 9;
tin_pan.push(' 戊己庚辛壬癸丁丙乙'.charAt(_tin));
}
}
// 计算八门
var houses_door_target = '18349276'.indexOf(jik_fu_mun);
var houses_door_idx = [1, 8, 3, 4, 9, 2, 7, 6];
//console.log("houses_door_target: ",houses_door_target);
//return;
var _jfi = jik_fu_idx == 5 ? 2 : jik_fu_idx;
while (houses_door_idx[houses_door_target] != _jfi) {
houses_door_idx.unshift(houses_door_idx.pop());
}
var door_pan = new Array(); //门盘(八门)
for (var i = 1; i < 10; i++) {
if (i == 5) {
door_pan.push(5);
} else {
door_pan.push(houses_door_idx['18349276'.indexOf(i)]);
}
}
var house_door = new Array();
for (var i = 0; i < 9; i++) {
house_door.push(',休死伤杜 开惊生景'.charAt(door_pan[i]));
}
// 计算八神
var houses_god;
if (dun_type == 1) {
// 阳遁-順排
var houses_god_target = '18349276'.indexOf(jik_fu_star);
houses_god = ['符', '蛇', '阴', '合', '白', '玄', '地', '天'];
while (houses_god[houses_god_target] != '符') {
houses_god.unshift(houses_god.pop());
}
} else {
var houses_god_target = '18349276'.indexOf(jik_fu_star);
houses_god = ['符', '天', '地', '玄', '白', '合', '阴', '蛇'];
while (houses_god[houses_god_target] != '符') {
houses_god.unshift(houses_god.pop());
}
}
var god_pan = new Array(); //神盘(八神)
for (var i = 1; i < 10; i++) {
if (i == 5) {
god_pan.push(' ');
} else {
god_pan.push(houses_god['18349276'.indexOf(i)]);
}
}
let sky = [];
let earth = [];
let star = [];
let gate = [];
let god = [];
let kong = [];
// 輸出天盘
// console.log('天盘:' + tin_pan.join(''));
sky = transPan(tin_pan);
// 輸出地盘
// console.log('地盘:' + dei_pan);
earth = transPan(dei_pan);
// 輸出星盘
// console.log('星盘:' + houses_star.join(''));
star = transPan(houses_star);
// 輸出门盘
// console.log('门盘:' + house_door.join(''));
gate = transPan(house_door);
// 輸出八神
// console.log('神盘:' + god_pan.join(''));
god = transPan(god_pan);
// 八字
let bz = '';
for (var i = 0; i < 8; i += 2) {
bz += fcol.substr(i, 2) + ' ';
}
calResult.bazi = bz;
// console.log('八字');
// console.log(this.bazi);
//時旬干
var chun_sau =
'子丑寅卯辰巳午未申酉戌亥'.indexOf(dcol0[0]) -
'甲乙丙丁戊己庚辛壬癸'.indexOf(tcol0[0]);
if (chun_sau < 0) chun_sau += 12;
var chun_gan = '甲乙丙丁戊己庚辛壬癸◯◯甲乙丙丁戊己庚辛壬癸◯◯'.substr(
12 - chun_sau,
12
);
// 输出空亡----------------------------------
calResult.kong = chun_gan.split('');
let qimenResult = [];
qimenResult = sky.map((item, index) => {
return {
sky: sky[index],
earth: earth[index],
star: star[index],
gate: gate[index],
god: god[index],
};
});
calResult.qimenResult = qimenResult;
return calResult;
}
// 八卦方位-> 3*3矩阵
function transPan(raw) {
let nn = [];
nn[0] = raw[3];
nn[1] = raw[8];
nn[2] = raw[1];
nn[3] = raw[2];
nn[4] = raw[4];
nn[5] = raw[6];
nn[6] = raw[7];
nn[7] = raw[0];
nn[8] = raw[5];
return nn;
}
function transKong(raw, str) {
let nn = [];
nn[0] = raw[4].indexOf(str) > -1 || raw[5].indexOf(str) > -1 ? str : '';
nn[1] = raw[6].indexOf(str) > -1 ? str : '';
nn[2] = raw[7].indexOf(str) > -1 || raw[8].indexOf(str) > -1 ? str : '';
nn[3] = raw[3].indexOf(str) > -1 ? str : '';
nn[4] = '';
nn[5] = raw[9].indexOf(str) > -1 ? str : '';
nn[6] = raw[1].indexOf(str) > -1 || raw[2].indexOf(str) > -1 ? str : '';
nn[7] = raw[0].indexOf(str) > -1 ? str : '';
nn[8] =
raw[10].indexOf(str) > -1 || raw[11].indexOf(str) > -1 ? str : '';
return nn;
}
function date_to_julian_day(y, m, d) {
var a = parseInt((14 - m) / 12);
var y = y + 4800 - a;
var m = m + 12 * a - 3;
return (
d +
parseInt((153 * m + 2) / 5) +
365 * y +
parseInt(y / 4) -
parseInt(y / 100) +
parseInt(y / 400) -
32045
);
}
function date_to_julian_day2(yr, mh, dy) {
var hr = 0;
var op = false;
if (yr < -400000 || yr > 400000) return false;
var yp = yr + Math.floor((mh - 3) / 10);
if (
yr > 1582 ||
(yr == 1582 && mh > 10) ||
(yr == 1582 && mh == 10 && dy >= 15) ||
op
) {
var init = 1721119.5;
var jdy =
Math.floor(yp * 365.25) -
Math.floor(yp / 100) +
Math.floor(yp / 400);
} else {
if (
yr < 1582 ||
(yr == 1582 && mh < 10) ||
(yr == 1582 && mh == 10 && dy <= 4)
) {
var init = 1721117.5;
var jdy = Math.floor(yp * 365.25);
} else {
return false;
}
}
var mp = Math.floor(mh + 9) % 12;
var jdm = mp * 30 + Math.floor(((mp + 1) * 34) / 57);
var jdd = dy - 1;
var jdh = hr / 24;
var jd = jdy + jdm + jdd + jdh + init;
return jd;
}
function date_to_julian_time(h, i, s) {
/*****
* h: hour
* i: minutes
* s: second
*/
return (h * 3600 + i * 60 + s) / 86400;
}
function JiQi() {
'use strict';
this.jq = new Array(
'春分',
'清明',
'谷雨',
'立夏',
'小满',
'芒种',
'夏至',
'小暑',
'大暑',
'立秋',
'处暑',
'白露',
'秋分',
'寒露',
'霜降',
'立冬',
'小雪',
'大雪',
'冬至',
'小寒',
'大寒',
'立春',
'雨水',
'惊蛰'
);
/**
* 輸出用
*/
this.jq0 = new Array(
'立春',
'雨水',
'惊蛰',
'春分',
'清明',
'谷雨',
'立夏',
'小满',
'芒种',
'夏至',
'小暑',
'大暑',
'立秋',
'处暑',
'白露',
'秋分',
'寒露',
'霜降',
'立冬',
'小雪',
'大雪',
'冬至',
'小寒',
'大寒'
);
this.jdez = new Array(30);
this.jdjq = new Array(26);
/*****
* 计算指定年份之春分點
*/
this.VE = function (yy) {
var yx = yy;
var jdve = 0;
if (yx >= 1000 && yx <= 8001) {
var m = (yx - 2000) / 1000;
jdve =
2451623.80984 +
365242.37404 * m +
0.05169 * m * m -
0.00411 * m * m * m -
0.00057 * m * m * m * m;
} else {
if (yx >= -8000 && yx < 1000) {
m = yx / 1000;
jdve =
1721139.29189 +
365242.1374 * m +
0.06134 * m * m +
0.00111 * m * m * m -
0.00071 * m * m * m * m;
} else {
// 超出计算能力範圍
return false;
}
}
return jdve;
};
/*****
* 计算及修正其他星球之影響而產生攝動
* 取得受perturbation影響所需微調
*/
this.Perturbation = function (jdez) {
var t = (jdez - 2451545) / 36525;
var s = 0;
var ptsa = new Array(
485,
203,
199,
182,
156,
136,
77,
74,
70,
58,
52,
50,
45,
44,
29,
18,
17,
16,
14,
12,
12,
12,
9,
8
);
var ptsb = new Array(
324.96,
337.23,
342.08,
27.85,
73.14,
171.52,
222.54,
296.72,
243.58,
119.81,
297.17,
21.02,
247.54,
325.15,
60.93,
155.12,
288.79,
198.04,
199.76,
95.39,
287.11,
320.81,
227.73,
15.45
);
var ptsc = new Array(
1934.136,
32964.467,
20.186,
445267.112,
45036.886,
22518.443,
65928.934,
3034.906,
9037.513,
33718.147,
150.678,
2281.226,
29929.562,
31555.956,
4443.417,
67555.328,
4562.452,
62894.029,
31436.921,
14577.848,
31931.756,
34777.259,
1222.114,
16859.074
);
for (var k = 0; k <= 23; k++) {
//s=s+this.ptsa[k]*Math.cos(this.ptsb[k]*2*Math.PI/360+this.ptsc[k]*2*Math.PI/360*t);
s =
s +
ptsa[k] *
Math.cos(
(ptsb[k] * 2 * Math.PI) / 360 +
((ptsc[k] * 2 * Math.PI) / 360) * t
);
}
var w = 35999.373 * t - 2.47;
var l =
1 +
0.0334 * Math.cos((w * 2 * Math.PI) / 360) +
0.0007 * Math.cos((2 * w * 2 * Math.PI) / 360);
var ptb = (0.00001 * s) / l;
return ptb;
};
/*****
* 计算地球運行速度偏差修正值
*
*/
this.DeltaT = function (yy, mm) {
var u, t, dt, y;
y = yy + (mm - 0.5) / 12;
if (y <= -500) {
u = (y - 1820) / 100;
dt = -20 + 32 * u * u;
} else {
if (y < 500) {
u = y / 100;
dt =
10583.6 -
1014.41 * u +
33.78311 * u * u -
5.952053 * u * u * u -
0.1798452 * u * u * u * u +
0.022174192 * u * u * u * u * u +
0.0090316521 * u * u * u * u * u * u;
} else {
if (y < 1600) {
u = (y - 1000) / 100;
dt =
1574.2 -
556.01 * u +
71.23472 * u * u +
0.319781 * u * u * u -
0.8503463 * u * u * u * u -
0.005050998 * u * u * u * u * u +
0.0083572073 * u * u * u * u * u * u;
} else {
if (y < 1700) {
t = y - 1600;
dt = 120 - 0.9808 * t - 0.01532 * t * t + (t * t * t) / 7129;
} else {
if (y < 1800) {
t = y - 1700;
dt =
8.83 +
0.1603 * t -
0.0059285 * t * t +
0.00013336 * t * t * t -
(t * t * t * t) / 1174000;
} else {
if (y < 1860) {
t = y - 1800;
dt =
13.72 -
0.332447 * t +
0.0068612 * t * t +
0.0041116 * t * t * t -
0.00037436 * t * t * t * t +
0.0000121272 * t * t * t * t * t -
0.0000001699 * t * t * t * t * t * t +
0.000000000875 * t * t * t * t * t * t * t;
} else {
if (y < 1900) {
t = y - 1860;
dt =
7.62 +
0.5737 * t -
0.251754 * t * t +
0.01680668 * t * t * t -
0.0004473624 * t * t * t * t +
(t * t * t * t * t) / 233174;
} else {
if (y < 1920) {
t = y - 1900;
dt =
-2.79 +
1.494119 * t -
0.0598939 * t * t +
0.0061966 * t * t * t -
0.000197 * t * t * t * t;
} else {
if (y < 1941) {
t = y - 1920;
dt =
21.2 +
0.84493 * t -
0.0761 * t * t +
0.0020936 * t * t * t;
} else {
if (y < 1961) {
t = y - 1950;
dt =
29.07 +
0.407 * t -
(t * t) / 233 +
(t * t * t) / 2547;
} else {
if (y < 1986) {
t = y - 1975;
dt =
45.45 +
1.067 * t -
(t * t) / 260 -
(t * t * t) / 718;
} else {
if (y < 2005) {
t = y - 2000;
dt =
63.86 +
0.3345 * t -
0.060374 * t * t +
0.0017275 * t * t * t +
0.000651814 * t * t * t * t +
0.00002373599 * t * t * t * t * t;
} else {
if (y < 2050) {
t = y - 2000;
dt = 62.92 + 0.32217 * t + 0.005589 * t * t;
} else {
if (y < 2150) {
u = (y - 1820) / 100;
dt =
-20 + 32 * u * u - 0.5628 * (2150 - y);
} else {
u = (y - 1820) / 100;
dt = -20 + 32 * u * u;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
if (y < 1955 || y >= 2005)
dt = dt - 0.000012932 * (y - 1955) * (y - 1955);
var DeltaT = dt / 60; //將秒轉換為分
return DeltaT;
};
/*****
*
*/
this.MeanJQJD = function (yy, jdve, ty, ini, num) {
var ath = (2 * Math.PI) / 24;
var tx = (jdve - 2451545) / 365250;
var e =
0.0167086342 -
0.0004203654 * tx -
0.0000126734 * tx * tx +
0.0000001444 * tx * tx * tx -
0.0000000002 * tx * tx * tx * tx +
0.0000000003 * tx * tx * tx * tx * tx;
var tt = yy / 1000;
var vp =
111.25586939 -
17.0119934518333 * tt -
0.044091890166673 * tt * tt -
4.37356166661345e-4 * tt * tt * tt +
8.16716666602386e-6 * tt * tt * tt * tt;
var rvp = (vp * 2 * Math.PI) / 360;
var peri = new Array(30);
var i;
for (i = 1; i <= ini + num; i++) {
var flag = 0;
var th = ath * (i - 1) + rvp;
if (th > Math.PI && th <= 3 * Math.PI) {
th = 2 * Math.PI - th;
flag = 1;
}
if (th > 3 * Math.PI) {
th = 4 * Math.PI - th;
flag = 2;
}
var f1 =
2 * Math.atan(Math.sqrt((1 - e) / (1 + e)) * Math.tan(th / 2));
var f2 =
(e * Math.sqrt(1 - e * e) * Math.sin(th)) /
(1 + e * Math.cos(th));
var f = ((f1 - f2) * ty) / 2 / Math.PI;
if (flag == 1) f = ty - f;
if (flag == 2) f = 2 * ty - f;
peri[i] = f;
}
for (i = ini; i <= ini + num; i++) {
this.jdez[i] = jdve + peri[i] - peri[1];
}
return true;
};
//副程式功能對Perturbaton作調整後的自春分點开始的24节气,可只取部份
this.GetAdjustedJQ = function (yy, ini, num, jdjq) {
var veb = this.VE(yy);
var ty = this.VE(yy + 1) - veb; //求指定年的春分點及回歸年長
if (this.MeanJQJD(yy, veb, ty, ini, num) == true) {
//輸入指定年,JD,回歸年長,求該回歸年各节气之長
for (var i = ini + 1; i <= ini + num; i++) {
var ptb = this.Perturbation(this.jdez[i]); //取得受perturbation影響所需微調
var dt = this.DeltaT(yy, Math.floor(i / 2) + 3); //修正dynamical time to Universal time
jdjq[i] = this.jdez[i] + ptb - dt / 60 / 24; //加上攝動調整值ptb減去對應的Delta T值(分鐘轉換為日)
jdjq[i] = jdjq[i] + 1 / 3; //因中國時間比格林威治時間先行8小時即1/3日
}
}
};
/*****
* 副程式功能求出以立春點开始的含中氣之12节气
*/
this.GetPureJQsinceSpring2 = function (yy, ptsa, ptsb, ptsc, jdpjq) {
var sjdjq = new Array();
var yea = yy - 1;
this.GetAdjustedJQ(yea, 21, 3, sjdjq); //求出含指定年立春开始之3個节气JD值,以前一年的年值代入
//轉移春分前之立春至惊蟄之节气至jdpjq變數中以重整index
jdpjq[0] = sjdjq[22]; //此為立春
jdpjq[1] = sjdjq[23]; //此為雨水
jdpjq[2] = sjdjq[24]; //此為惊蟄
yea = yy;
//GetAdjustedJQ(yea, 0, 26, sjdjq); //求出指定年节气之JD值,從惊蟄开始,到雨水
this.GetAdjustedJQ(yea, 0, 26, sjdjq); //求出指定年节气之JD值,從惊蟄开始,到雨水
//jdpjq[3] =sjdjq[25]; //此為當年春分
//轉移春分至小寒之节气至jdpjq變數中以重整index
//jdpjq[3] =sjdjq[0];
for (var i = 2; i <= 24; i++) {
//jdpjq[i+1] = sjdjq[2 * i];
jdpjq[i + 1] = sjdjq[i - 1];
}
};
/*****
* 將儒略日換成年月日時分秒
*/
this.Jtime = function (op, jd) {
if (jd >= 2299160.5 || op) {
var y4h = 146097;
var init = 1721119.5;
} else {
var y4h = 146100;
var init = 1721117.5;
}
var jdr = Math.floor(jd - init);
var yh = y4h / 4;
var cen = Math.floor((jdr + 0.75) / yh);
var d = Math.floor(jdr + 0.75 - cen * yh);
var ywl = 1461 / 4;
var jy = Math.floor((d + 0.75) / ywl);
d = Math.floor(d + 0.75 - ywl * jy + 1);
var ml = 153 / 5;
var mp = Math.floor((d - 0.5) / ml);
d = Math.floor(d - 0.5 - 30.6 * mp + 1);
var y = 100 * cen + jy;
var m = ((mp + 2) % 12) + 1;
if (m < 3) y = y + 1;
var sd = Math.floor(
(jd + 0.5 - Math.floor(jd + 0.5)) * 24 * 60 * 60 + 0.00005
);
var mt = Math.floor(sd / 60);
var ss = sd % 60;
var hh = Math.floor(mt / 60);
var mmt = mt % 60;
var yy = Math.floor(y);
var mm = Math.floor(m);
var dd = Math.floor(d);
var yc = ' ' + yy;
yc = yc.substr(yc.length - 5, 5);
var dytm = yc;
dytm += '年';
dytm += (mm < 10 ? '0' : '') + mm + '月';
dytm += (dd < 10 ? '0' : '') + dd + '日';
dytm += (hh < 10 ? '0' : '') + hh + '時';
dytm += (mmt < 10 ? '0' : '') + mmt + '分';
dytm += (ss < 10 ? '0' : '') + ss + '秒';
dytm += ', 星期' + '日一二三四五六'.charAt((jd + 1.5) % 7);
return dytm.trim();
};
/**
* 四柱计算, 子初換日
*/
this.GetGZ = function (y, m, d, h, i, s, ms) {
var jtoday =
date_to_julian_day2(y, m, d) + date_to_julian_time(h, i, s);
var jqTime = new Array();
//var y = this.Jtime(jtoday);
this.GetPureJQsinceSpring2(y, 0, 0, 0, jqTime); // 计算當年节气(以立春日為新一年)
if (jtoday < jqTime[0]) {
y = y - 1;
this.GetPureJQsinceSpring2(y, 0, 0, 0, jqTime); // 计算上一年节气(以立春日為新一年)
//console.log("计算上一年节气(以立春日為新一年)");
}
// 四柱回傳
var tin = '甲乙丙丁戊己庚辛壬癸甲乙丙丁戊己庚辛壬癸甲乙';
var di = '子丑寅卯辰巳午未申酉戌亥';
var rtn_gz = new Array();
// 計年柱
var ygz = (((y + 4712 + 24) % 60) + 60) % 60;
rtn_gz.push(tin[ygz % 10]);
rtn_gz.push(di[ygz % 12]);
// 計月柱
var dgz = -1;
for (var ii = 24; ii > 0; ii--) {
if (jtoday > jqTime[ii - 1]) {
dgz = ii;
break;
}
}
if (dgz < 0) dgz = 1;
if (dgz % 2 == 0) dgz--;
dgz = Math.floor(dgz / 2);
if (dgz == 12) dgz = 11;
rtn_gz.push(
tin.substr(Math.floor(((ygz % 10) % 5) * 2 + 2), 12)[dgz]
); // 月干
rtn_gz.push('寅卯辰巳午未申酉戌亥子丑'.charAt(dgz)); // 月支
// 計日柱
var jda = jtoday + 0.5;
var thes = (jda - Math.floor(jda)) * 86400 + 3600;
var dayjd = Math.floor(jda) + thes / 86400;
dgz = ((Math.floor(dayjd + 49) % 60) + 60) % 60;
// if(h >= 23) dgz--; // 子正換日處理, 測試用
rtn_gz.push(tin[dgz % 10]); // 日干
rtn_gz.push(di[dgz % 12]); // 日支
// 計時柱
var dh = dayjd * 12;
//var hgz = (Math.floor(dh + 48) % 60 + 60) % 60;console.log('hgz',(Math.floor(dh + 48) % 60));
var hgz = ((Math.floor(dh + 48) % 60) + 60) % 60;
//console.log(h,Math.ceil(h/2)%12,di[(h/2)%12],di[hgz % 12]);
//if((h%2) == 1 && i == 0) hgz += 1;
if (Math.ceil(h / 2) % 12 != hgz % 12) hgz++;
rtn_gz.push(tin[hgz % 10]); // 時干
rtn_gz.push(di[hgz % 12]); // 時支
// 計分柱
var minhz = i;
if (h % 2 == 0) minhz += 60;
minhz = Math.floor((minhz * 60) / 600);
var gan_idx = [0, 2, 4, 6, 8, 0, 2, 4, 6, 8];
rtn_gz.push(
tin.substr(gan_idx[tin.indexOf(rtn_gz[6])], 12).charAt(minhz)
); // 分干
rtn_gz.push(di[minhz % 12]); // 分支
// 計秒柱
var minhz = i;
if (h % 2 == 0) minhz += 60;
minhz = Math.floor((((minhz * 60) % 600) + s) / 50);
var gan_idx = [0, 2, 4, 6, 8, 0, 2, 4, 6, 8];
rtn_gz.push(
tin.substr(gan_idx[tin.indexOf(rtn_gz[8])], 12).charAt(minhz)
); // 秒干
rtn_gz.push(di[minhz % 12]); // 秒支
/**
* 如有毫秒輸入, 计算毫秒柱, 無極, 混元, 究竟
*/
if (1) {
var minhz = i;
if (h % 2 == 0) minhz += 60;
minhz = minhz * 60 + s;
minhz = minhz * 1000 + ms;
var minhz1 = Math.floor(minhz / 600000); //分柱
var minhz2 = Math.floor((minhz % 600000) / 50000); //秒柱
var minhz3 = Math.floor((minhz % 50000) / (50000 / 12.0)); //毫秒柱
var minhz4 = Math.floor(
(minhz % (50000 / 12.0)) / (50000 / 12.0 / 12.0)
); //無極柱
var minhz5 = Math.floor(
(minhz % (50000 / 12.0 / 12.0)) / (50000 / 12.0 / 12.0 / 12.0)
); //究竟柱
var minhz6 = Math.floor(
(minhz % (50000 / 12.0 / 12.0 / 12.0)) /
(50000 / 12.0 / 12.0 / 12.0 / 12.0)
); //破限柱
//
//console.log(minhz1,minhz2,minhz3,minhz4,minhz5,minhz6);
var gan_idx = [0, 2, 4, 6, 8, 0, 2, 4, 6, 8];
rtn_gz.push(
tin.substr(gan_idx[tin.indexOf(rtn_gz[10])], 12).charAt(minhz3)
); // 毫秒柱
rtn_gz.push(di[minhz3 % 12]); //
rtn_gz.push(
tin.substr(gan_idx[tin.indexOf(rtn_gz[12])], 12).charAt(minhz4)
); // 無極柱
rtn_gz.push(di[minhz4 % 12]); //
rtn_gz.push(
tin.substr(gan_idx[tin.indexOf(rtn_gz[14])], 12).charAt(minhz5)
); // 究竟柱
rtn_gz.push(di[minhz5 % 12]); //
rtn_gz.push(
tin.substr(gan_idx[tin.indexOf(rtn_gz[16])], 12).charAt(minhz6)
); // 究竟柱
rtn_gz.push(di[minhz6 % 12]); //
}
return rtn_gz.join('');
};
}
/**
* @1900-2100区间内的公历、农历互转
* @charset UTF-8
* @Author Jea杨(JJonline@JJonline.Cn)
* @Time 2014-7-21
* @Time 2016-8-13 Fixed 2033hex、Attribution Annals
* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug
* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
* @Version 1.0.3
* @公历转农历calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
* @农历转公历calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
*/
const calendar = {
/**
* 农历1900-2100的润大小信息表
* @Array Of Property
* @return Hex
*/
lunarInfo: [
0x04bd8,
0x04ae0,
0x0a570,
0x054d5,
0x0d260,
0x0d950,
0x16554,
0x056a0,
0x09ad0,
0x055d2, //1900-1909
0x04ae0,
0x0a5b6,
0x0a4d0,
0x0d250,
0x1d255,
0x0b540,
0x0d6a0,
0x0ada2,
0x095b0,
0x14977, //1910-1919
0x04970,
0x0a4b0,
0x0b4b5,
0x06a50,
0x06d40,
0x1ab54,
0x02b60,
0x09570,
0x052f2,
0x04970, //1920-1929
0x06566,
0x0d4a0,
0x0ea50,
0x16a95,
0x05ad0,
0x02b60,
0x186e3,
0x092e0,
0x1c8d7,
0x0c950, //1930-1939
0x0d4a0,
0x1d8a6,
0x0b550,
0x056a0,
0x1a5b4,
0x025d0,
0x092d0,
0x0d2b2,
0x0a950,
0x0b557, //1940-1949
0x06ca0,
0x0b550,
0x15355,
0x04da0,
0x0a5b0,
0x14573,
0x052b0,
0x0a9a8,
0x0e950,
0x06aa0, //1950-1959
0x0aea6,
0x0ab50,
0x04b60,
0x0aae4,
0x0a570,
0x05260,
0x0f263,
0x0d950,
0x05b57,
0x056a0, //1960-1969
0x096d0,
0x04dd5,
0x04ad0,
0x0a4d0,
0x0d4d4,
0x0d250,
0x0d558,
0x0b540,
0x0b6a0,
0x195a6, //1970-1979
0x095b0,
0x049b0,
0x0a974,
0x0a4b0,
0x0b27a,
0x06a50,
0x06d40,
0x0af46,
0x0ab60,
0x09570, //1980-1989
0x04af5,
0x04970,
0x064b0,
0x074a3,
0x0ea50,
0x06b58,
0x05ac0,
0x0ab60,
0x096d5,
0x092e0, //1990-1999
0x0c960,
0x0d954,
0x0d4a0,
0x0da50,
0x07552,
0x056a0,
0x0abb7,
0x025d0,
0x092d0,
0x0cab5, //2000-2009
0x0a950,
0x0b4a0,
0x0baa4,
0x0ad50,
0x055d9,
0x04ba0,
0x0a5b0,
0x15176,
0x052b0,
0x0a930, //2010-2019
0x07954,
0x06aa0,
0x0ad50,
0x05b52,
0x04b60,
0x0a6e6,
0x0a4e0,
0x0d260,
0x0ea65,
0x0d530, //2020-2029
0x05aa0,
0x076a3,
0x096d0,
0x04afb,
0x04ad0,
0x0a4d0,
0x1d0b6,
0x0d250,
0x0d520,
0x0dd45, //2030-2039
0x0b5a0,
0x056d0,
0x055b2,
0x049b0,
0x0a577,
0x0a4b0,
0x0aa50,
0x1b255,
0x06d20,
0x0ada0, //2040-2049
/**Add By JJonline@JJonline.Cn**/
0x14b63,
0x09370,
0x049f8,
0x04970,
0x064b0,
0x168a6,
0x0ea50,
0x06b20,
0x1a6c4,
0x0aae0, //2050-2059
0x092e0,
0x0d2e3,
0x0c960,
0x0d557,
0x0d4a0,
0x0da50,
0x05d55,
0x056a0,
0x0a6d0,
0x055d4, //2060-2069
0x052d0,
0x0a9b8,
0x0a950,
0x0b4a0,
0x0b6a6,
0x0ad50,
0x055a0,
0x0aba4,
0x0a5b0,
0x052b0, //2070-2079
0x0b273,
0x06930,
0x07337,
0x06aa0,
0x0ad50,
0x14b55,
0x04b60,
0x0a570,
0x054e4,
0x0d160, //2080-2089
0x0e968,
0x0d520,
0x0daa0,
0x16aa6,
0x056d0,
0x04ae0,
0x0a9d4,
0x0a2d0,
0x0d150,
0x0f252, //2090-2099
0x0d520,
], //2100
/**
* 公历每个月份的天数普通表
* @Array Of Property
* @return Number
*/
solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
/**
* 天干地支之天干速查表
* @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
* @return Cn string
*/
Gan: [
'\u7532',
'\u4e59',
'\u4e19',
'\u4e01',
'\u620a',
'\u5df1',
'\u5e9a',
'\u8f9b',
'\u58ec',
'\u7678',
],
/**
* 天干地支之地支速查表
* @Array Of Property
* @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
* @return Cn string
*/
Zhi: [
'\u5b50',
'\u4e11',
'\u5bc5',
'\u536f',
'\u8fb0',
'\u5df3',
'\u5348',
'\u672a',
'\u7533',
'\u9149',
'\u620c',
'\u4ea5',
],
/**
* 天干地支之地支速查表<=>生肖
* @Array Of Property
* @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
* @return Cn string
*/
Animals: [
'\u9f20',
'\u725b',
'\u864e',
'\u5154',
'\u9f99',
'\u86c7',
'\u9a6c',
'\u7f8a',
'\u7334',
'\u9e21',
'\u72d7',
'\u732a',
],
/**
* 阳历节日
*/
festival: {
'1-1': {
title: '元旦节',
},
'2-14': {
title: '情人节',
},
'5-1': {
title: '劳动节',
},
'5-4': {
title: '青年节',
},
'6-1': {
title: '儿童节',
},
'9-10': {
title: '教师节',
},
'10-1': {
title: '国庆节',
},
'12-25': {
title: '圣诞节',
},
'3-8': {
title: '妇女节',
},
'3-12': {
title: '植树节',
},
'4-1': {
title: '愚人节',
},
'5-12': {
title: '护士节',
},
'7-1': {
title: '建党节',
},
'8-1': {
title: '建军节',
},
'12-24': {
title: '平安夜',
},
},
/**
* 农历节日
*/
lFestival: {
'12-30': {
title: '除夕',
},
'1-1': {
title: '春节',
},
'1-15': {
title: '元宵节',
},
'2-2': {
title: '龙抬头',
},
'5-5': {
title: '端午节',
},
'7-7': {
title: '七夕节',
},
'7-15': {
title: '中元节',
},
'8-15': {
title: '中秋节',
},
'9-9': {
title: '重阳节',
},
'10-1': {
title: '寒衣节',
},
'10-15': {
title: '下元节',
},
'12-8': {
title: '腊八节',
},
'12-23': {
title: '北方小年',
},
'12-24': {
title: '南方小年',
},
},
/**
* 返回默认定义的阳历节日
*/
getFestival() {
return this.festival;
},
/**
* 返回默认定义的内容里节日
*/
getLunarFestival() {
return this.lFestival;
},
/**
*
* @param param {Object} 按照festival的格式输入数据设置阳历节日
*/
setFestival(param = {}) {
this.festival = param;
},
/**
*
* @param param {Object} 按照lFestival的格式输入数据设置农历节日
*/
setLunarFestival(param = {}) {
this.lFestival = param;
},
/**
* 24节气速查表
* @Array Of Property
* @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
* @return Cn string
*/
solarTerm: [
'\u5c0f\u5bd2',
'\u5927\u5bd2',
'\u7acb\u6625',
'\u96e8\u6c34',
'\u60ca\u86f0',
'\u6625\u5206',
'\u6e05\u660e',
'\u8c37\u96e8',
'\u7acb\u590f',
'\u5c0f\u6ee1',
'\u8292\u79cd',
'\u590f\u81f3',
'\u5c0f\u6691',
'\u5927\u6691',
'\u7acb\u79cb',
'\u5904\u6691',
'\u767d\u9732',
'\u79cb\u5206',
'\u5bd2\u9732',
'\u971c\u964d',
'\u7acb\u51ac',
'\u5c0f\u96ea',
'\u5927\u96ea',
'\u51ac\u81f3',
],
/**
* 1900-2100各年的24节气日期速查表
* @Array Of Property
* @return 0x string For splice
*/
sTermInfo: [
'9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf97c3598082c95f8c965cc920f',
'97bd0b06bdb0722c965ce1cfcc920f',
'b027097bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf97c359801ec95f8c965cc920f',
'97bd0b06bdb0722c965ce1cfcc920f',
'b027097bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf97c359801ec95f8c965cc920f',
'97bd0b06bdb0722c965ce1cfcc920f',
'b027097bd097c36b0b6fc9274c91aa',
'9778397bd19801ec9210c965cc920e',
'97b6b97bd19801ec95f8c965cc920f',
'97bd09801d98082c95f8e1cfcc920f',
'97bd097bd097c36b0b6fc9210c8dc2',
'9778397bd197c36c9210c9274c91aa',
'97b6b97bd19801ec95f8c965cc920e',
'97bd09801d98082c95f8e1cfcc920f',
'97bd097bd097c36b0b6fc9210c8dc2',
'9778397bd097c36c9210c9274c91aa',
'97b6b97bd19801ec95f8c965cc920e',
'97bcf97c3598082c95f8e1cfcc920f',
'97bd097bd097c36b0b6fc9210c8dc2',
'9778397bd097c36c9210c9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf97c3598082c95f8c965cc920f',
'97bd097bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf97c3598082c95f8c965cc920f',
'97bd097bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf97c359801ec95f8c965cc920f',
'97bd097bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf97c359801ec95f8c965cc920f',
'97bd097bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf97c359801ec95f8c965cc920f',
'97bd097bd07f595b0b6fc920fb0722',
'9778397bd097c36b0b6fc9210c8dc2',
'9778397bd19801ec9210c9274c920e',
'97b6b97bd19801ec95f8c965cc920f',
'97bd07f5307f595b0b0bc920fb0722',
'7f0e397bd097c36b0b6fc9210c8dc2',
'9778397bd097c36c9210c9274c920e',
'97b6b97bd19801ec95f8c965cc920f',
'97bd07f5307f595b0b0bc920fb0722',
'7f0e397bd097c36b0b6fc9210c8dc2',
'9778397bd097c36c9210c9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bd07f1487f595b0b0bc920fb0722',
'7f0e397bd097c36b0b6fc9210c8dc2',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf7f1487f595b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf7f1487f595b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf7f1487f531b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e',
'97bcf7f1487f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c9274c920e',
'97bcf7f0e47f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722',
'9778397bd097c36b0b6fc9210c91aa',
'97b6b97bd197c36c9210c9274c920e',
'97bcf7f0e47f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722',
'9778397bd097c36b0b6fc9210c8dc2',
'9778397bd097c36c9210c9274c920e',
'97b6b7f0e47f531b0723b0b6fb0722',
'7f0e37f5307f595b0b0bc920fb0722',
'7f0e397bd097c36b0b6fc9210c8dc2',
'9778397bd097c36b0b70c9274c91aa',
'97b6b7f0e47f531b0723b0b6fb0721',
'7f0e37f1487f595b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc9210c8dc2',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f595b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722',
'9778397bd097c36b0b6fc9274c91aa',
'97b6b7f0e47f531b0723b0787b0721',
'7f0e27f0e47f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722',
'9778397bd097c36b0b6fc9210c91aa',
'97b6b7f0e47f149b0723b0787b0721',
'7f0e27f0e47f531b0723b0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722',
'9778397bd097c36b0b6fc9210c8dc2',
'977837f0e37f149b0723b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0722',
'7f0e37f5307f595b0b0bc920fb0722',
'7f0e397bd097c35b0b6fc9210c8dc2',
'977837f0e37f14998082b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0721',
'7f0e37f1487f595b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc9210c8dc2',
'977837f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722',
'977837f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722',
'977837f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722',
'977837f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722',
'977837f0e37f14998082b0787b06bd',
'7f07e7f0e47f149b0723b0787b0721',
'7f0e27f0e47f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722',
'977837f0e37f14998082b0723b06bd',
'7f07e7f0e37f149b0723b0787b0721',
'7f0e27f0e47f531b0723b0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722',
'977837f0e37f14898082b0723b02d5',
'7ec967f0e37f14998082b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0722',
'7f0e37f1487f595b0b0bb0b6fb0722',
'7f0e37f0e37f14898082b0723b02d5',
'7ec967f0e37f14998082b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0722',
'7f0e37f1487f531b0b0bb0b6fb0722',
'7f0e37f0e37f14898082b0723b02d5',
'7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721',
'7f0e37f1487f531b0b0bb0b6fb0722',
'7f0e37f0e37f14898082b072297c35',
'7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e37f0e37f14898082b072297c35',
'7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e37f0e366aa89801eb072297c35',
'7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f149b0723b0787b0721',
'7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e37f0e366aa89801eb072297c35',
'7ec967f0e37f14998082b0723b06bd',
'7f07e7f0e47f149b0723b0787b0721',
'7f0e27f0e47f531b0723b0b6fb0722',
'7f0e37f0e366aa89801eb072297c35',
'7ec967f0e37f14998082b0723b06bd',
'7f07e7f0e37f14998083b0787b0721',
'7f0e27f0e47f531b0723b0b6fb0722',
'7f0e37f0e366aa89801eb072297c35',
'7ec967f0e37f14898082b0723b02d5',
'7f07e7f0e37f14998082b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0722',
'7f0e36665b66aa89801e9808297c35',
'665f67f0e37f14898082b0723b02d5',
'7ec967f0e37f14998082b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0722',
'7f0e36665b66a449801e9808297c35',
'665f67f0e37f14898082b0723b02d5',
'7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721',
'7f0e36665b66a449801e9808297c35',
'665f67f0e37f14898082b072297c35',
'7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721',
'7f0e26665b66a449801e9808297c35',
'665f67f0e37f1489801eb072297c35',
'7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722',
],
/**
* 数字转中文速查表
* @Array Of Property
* @trans ['日','一','二','三','四','五','六','七','八','九','十']
* @return Cn string
*/
nStr1: [
'\u65e5',
'\u4e00',
'\u4e8c',
'\u4e09',
'\u56db',
'\u4e94',
'\u516d',
'\u4e03',
'\u516b',
'\u4e5d',
'\u5341',
],
/**
* 日期转农历称呼速查表
* @Array Of Property
* @trans ['初','十','廿','卅']
* @return Cn string
*/
nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'],
/**
* 月份转农历称呼速查表
* @Array Of Property
* @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
* @return Cn string
*/
nStr3: [
'\u6b63',
'\u4e8c',
'\u4e09',
'\u56db',
'\u4e94',
'\u516d',
'\u4e03',
'\u516b',
'\u4e5d',
'\u5341',
'\u51ac',
'\u814a',
],
/**
* 返回农历y年一整年的总天数
* @param y lunar Year
* @return Number
* @eg:var count = calendar.lYearDays(1987) ;//count=387
*/
lYearDays: function (y) {
let i,
sum = 348;
for (i = 0x8000; i > 0x8; i >>= 1) {
sum += this.lunarInfo[y - 1900] & i ? 1 : 0;
}
return sum + this.leapDays(y);
},
/**
* 返回农历y年闰月是哪个月若y年没有闰月 则返回0
* @param y lunar Year
* @return Number (0-12)
* @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
*/
leapMonth: function (y) {
//闰字编码 \u95f0
return this.lunarInfo[y - 1900] & 0xf;
},
/**
* 返回农历y年闰月的天数 若该年没有闰月则返回0
* @param y lunar Year
* @return Number (0、29、30)
* @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
*/
leapDays: function (y) {
if (this.leapMonth(y)) {
return this.lunarInfo[y - 1900] & 0x10000 ? 30 : 29;
}
return 0;
},
/**
* 返回农历y年m月非闰月的总天数计算m为闰月时的天数请使用leapDays方法
* @param y lunar Year
* @param m lunar Month
* @return Number (-1、29、30)
* @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
*/
monthDays: function (y, m) {
if (m > 12 || m < 1) {
return -1;
} //月份参数从1至12参数错误返回-1
return this.lunarInfo[y - 1900] & (0x10000 >> m) ? 30 : 29;
},
/**
* 返回公历(!)y年m月的天数
* @param y solar Year
* @param m solar Month
* @return Number (-1、28、29、30、31)
* @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
*/
solarDays: function (y, m) {
if (m > 12 || m < 1) {
return -1;
} //若参数错误 返回-1
const ms = m - 1;
if (ms === 1) {
//2月份的闰平规律测算后确认返回28或29
return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0 ? 29 : 28;
} else {
return this.solarMonth[ms];
}
},
/**
* 农历年份转换为干支纪年
* @param lYear 农历年的年份数
* @return Cn string
*/
toGanZhiYear: function (lYear) {
var ganKey = (lYear - 3) % 10;
var zhiKey = (lYear - 3) % 12;
if (ganKey === 0) ganKey = 10; //如果余数为0则为最后一个天干
if (zhiKey === 0) zhiKey = 12; //如果余数为0则为最后一个地支
return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1];
},
/**
* 公历月、日判断所属星座
* @param cMonth [description]
* @param cDay [description]
* @return Cn string
*/
toAstro: function (cMonth, cDay) {
const s =
'\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf';
const arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22];
return (
s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) +
'\u5ea7'
); //座
},
/**
* 传入offset偏移量返回干支
* @param offset 相对甲子的偏移量
* @return Cn string
*/
toGanZhi: function (offset) {
return this.Gan[offset % 10] + this.Zhi[offset % 12];
},
/**
* 传入公历(!)y年获得该年第n个节气的公历日期
* @param y y公历年(1900-2100)
* @param n n二十四节气中的第几个节气(1~24)从n=1(小寒)算起
* @return day Number
* @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
*/
getTerm: function (y, n) {
if (y < 1900 || y > 2100 || n < 1 || n > 24) {
return -1;
}
const _table = this.sTermInfo[y - 1900];
const _calcDay = [];
for (let index = 0; index < _table.length; index += 5) {
const chunk = parseInt('0x' + _table.substr(index, 5)).toString();
_calcDay.push(
chunk[0],
chunk.substr(1, 2),
chunk[3],
chunk.substr(4, 2)
);
}
return parseInt(_calcDay[n - 1]);
},
/**
* 传入农历数字月份返回汉语通俗表示法
* @param m lunar month
* @return Cn string
* @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
*/
toChinaMonth: function (m) {
// 月 => \u6708
if (m > 12 || m < 1) {
return -1;
} //若参数错误 返回-1
let s = this.nStr3[m - 1];
s += '\u6708'; //加上月字
return s;
},
/**
* 传入农历日期数字返回汉字表示法
* @param d lunar day
* @return Cn string
* @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
*/
toChinaDay: function (d) {
//日 => \u65e5
let s;
switch (d) {
case 10:
s = '\u521d\u5341';
break;
case 20:
s = '\u4e8c\u5341';
break;
case 30:
s = '\u4e09\u5341';
break;
default:
s = this.nStr2[Math.floor(d / 10)];
s += this.nStr1[d % 10];
}
return s;
},
/**
* 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
* @param y year
* @return Cn string
* @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
*/
getAnimal: function (y) {
return this.Animals[(y - 4) % 12];
},
/**
* 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
* !important! 公历参数区间1900.1.31~2100.12.31
* @param yPara solar year
* @param mPara solar month
* @param dPara solar day
* @return JSON object
* @eg:console.log(calendar.solar2lunar(1987,11,01));
*/
solar2lunar: function (yPara, mPara, dPara) {
let y = parseInt(yPara);
let m = parseInt(mPara);
let d = parseInt(dPara);
//年份限定、上限
if (y < 1900 || y > 2100) {
return -1; // undefined转换为数字变为NaN
}
//公历传参最下限
if (y === 1900 && m === 1 && d < 31) {
return -1;
}
//未传参 获得当天
let objDate;
if (!y) {
objDate = new Date();
} else {
objDate = new Date(y, parseInt(m) - 1, d);
}
let i,
leap = 0,
temp = 0;
//修正ymd参数
y = objDate.getFullYear();
m = objDate.getMonth() + 1;
d = objDate.getDate();
let offset =
(Date.UTC(
objDate.getFullYear(),
objDate.getMonth(),
objDate.getDate()
) -
Date.UTC(1900, 0, 31)) /
86400000;
for (i = 1900; i < 2101 && offset > 0; i++) {
temp = this.lYearDays(i);
offset -= temp;
}
if (offset < 0) {
offset += temp;
i--;
}
//是否今天
let isTodayObj = new Date(),
isToday = false;
if (
isTodayObj.getFullYear() === y &&
isTodayObj.getMonth() + 1 === m &&
isTodayObj.getDate() === d
) {
isToday = true;
}
//星期几
let nWeek = objDate.getDay(),
cWeek = this.nStr1[nWeek];
//数字表示周几顺应天朝周一开始的惯例
if (nWeek === 0) {
nWeek = 7;
}
//农历年
const year = i;
leap = this.leapMonth(i); //闰哪个月
let isLeap = false;
//效验闰月
for (i = 1; i < 13 && offset > 0; i++) {
//闰月
if (leap > 0 && i === leap + 1 && isLeap === false) {
--i;
isLeap = true;
temp = this.leapDays(year); //计算农历闰月天数
} else {
temp = this.monthDays(year, i); //计算农历普通月天数
}
//解除闰月
if (isLeap === true && i === leap + 1) {
isLeap = false;
}
offset -= temp;
}
// 闰月导致数组下标重叠取反
if (offset === 0 && leap > 0 && i === leap + 1) {
if (isLeap) {
isLeap = false;
} else {
isLeap = true;
--i;
}
}
if (offset < 0) {
offset += temp;
--i;
}
//农历月
const month = i;
//农历日
const day = offset + 1;
//天干地支处理
const sm = m - 1;
const gzY = this.toGanZhiYear(year);
// 当月的两个节气
// bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
const firstNode = this.getTerm(y, m * 2 - 1); //返回当月「节」为几日开始
const secondNode = this.getTerm(y, m * 2); //返回当月「节」为几日开始
// 依据12节气修正干支月
let gzM = this.toGanZhi((y - 1900) * 12 + m + 11);
if (d >= firstNode) {
gzM = this.toGanZhi((y - 1900) * 12 + m + 12);
}
//传入的日期的节气与否
let isTerm = false;
let Term = null;
if (firstNode === d) {
isTerm = true;
Term = this.solarTerm[m * 2 - 2];
}
if (secondNode === d) {
isTerm = true;
Term = this.solarTerm[m * 2 - 1];
}
//日柱 当月一日与 1900/1/1 相差天数
const dayCyclical =
Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10;
const gzD = this.toGanZhi(dayCyclical + d - 1);
//该日期所属的星座
const astro = this.toAstro(m, d);
const solarDate = y + '-' + m + '-' + d;
const lunarDate = year + '-' + month + '-' + day;
const festival = this.festival;
const lFestival = this.lFestival;
const festivalDate = m + '-' + d;
let lunarFestivalDate = month + '-' + day;
// bugfix https://github.com/jjonline/calendar.js/issues/29
// 农历节日修正农历12月小月则29号除夕大月则30号除夕
// 此处取巧修正当前为农历12月29号时增加一次判断并且把lunarFestivalDate设置为12-30以正确取得除夕
// 天朝农历节日遇闰月过前不过后的原则此处取农历12月天数不考虑闰月
// 农历润12月在本工具支持的200年区间内仅1574年出现
if (
month === 12 &&
day === 29 &&
this.monthDays(year, month) === 29
) {
lunarFestivalDate = '12-30';
}
return {
date: solarDate,
lunarDate: lunarDate,
festival: festival[festivalDate]
? festival[festivalDate].title
: null,
lunarFestival: lFestival[lunarFestivalDate]
? lFestival[lunarFestivalDate].title
: null,
lYear: year,
lMonth: month,
lDay: day,
Animal: this.getAnimal(year),
IMonthCn: (isLeap ? '\u95f0' : '') + this.toChinaMonth(month),
IDayCn: this.toChinaDay(day),
cYear: y,
cMonth: m,
cDay: d,
gzYear: gzY,
gzMonth: gzM,
gzDay: gzD,
isToday: isToday,
isLeap: isLeap,
nWeek: nWeek,
ncWeek: '\u661f\u671f' + cWeek,
isTerm: isTerm,
Term: Term,
astro: astro,
};
},
/**
* 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
* !important! 参数区间1900.1.31~2100.12.1
* @param y lunar year
* @param m lunar month
* @param d lunar day
* @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
* @return JSON object
* @eg:console.log(calendar.lunar2solar(1987,9,10));
*/
lunar2solar: function (y, m, d, isLeapMonth) {
y = parseInt(y);
m = parseInt(m);
d = parseInt(d);
isLeapMonth = !!isLeapMonth;
const leapOffset = 0;
const leapMonth = this.leapMonth(y);
const leapDay = this.leapDays(y);
if (isLeapMonth && leapMonth !== m) {
return -1;
} //传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
if (
(y === 2100 && m === 12 && d > 1) ||
(y === 1900 && m === 1 && d < 31)
) {
return -1;
} //超出了最大极限值
const day = this.monthDays(y, m);
let _day = day;
//bugFix 2016-9-25
//if month is leap, _day use leapDays method
if (isLeapMonth) {
_day = this.leapDays(y, m);
}
if (y < 1900 || y > 2100 || d > _day) {
return -1;
} //参数合法性效验
//计算农历的时间差
let offset = 0;
let i;
for (i = 1900; i < y; i++) {
offset += this.lYearDays(i);
}
let leap = 0,
isAdd = false;
for (i = 1; i < m; i++) {
leap = this.leapMonth(y);
if (!isAdd) {
//处理闰月
if (leap <= i && leap > 0) {
offset += this.leapDays(y);
isAdd = true;
}
}
offset += this.monthDays(y, i);
}
//转换闰月农历 需补充该年闰月的前一个月的时差
if (isLeapMonth) {
offset += day;
}
//1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
const strap = Date.UTC(1900, 1, 30, 0, 0, 0);
const calObj = new Date((offset + d - 31) * 86400000 + strap);
const cY = calObj.getUTCFullYear();
const cM = calObj.getUTCMonth() + 1;
const cD = calObj.getUTCDate();
return this.solar2lunar(cY, cM, cD);
},
};
</script>
</body>
</html>