📄 lunar.js
字号:
s += (s?';':'') + '['+ob[i+3]+']'+ob[i+4]+' '+ob[i+5]+' '+c; //i为年号元年,i+3朝代,i+4朝号,i+5皇帝,i+6年号
}
return s;
},
getDayNameL:function(u,r){ //计算农历节日
//按农历日期查找重量点节假日
var d=u.Lmc + (u.Lmc.length<2?'月':'') + u.Ldc;
if(u.Lleep!='闰'){
if(d=='正月初一') r.A += '春节 ', r.Fjia = 1; //Fjia(放假)
if(d=='正月初二') r.B += '大年初二 ', r.Fjia = 1;
if(d=='五月初五') r.A += '端午节 ', r.Fjia = 1;
if(d=='八月十五') r.A += '中秋节 ', r.Fjia = 1;
if(d=='正月十五') r.A += '元宵节 ',r.B += '上元节 ', r.C += '壮族歌墟节 苗族踩山节 达斡尔族卡钦 ';
if(d=='正月十六') r.C += '侗族芦笙节(至正月二十) ';
if(d=='正月廿五') r.C += '填仓节 ';
if(d=='正月廿九') r.C += '送穷日 ';
if(d=='二月初一') r.C += '瑶族忌鸟节 ';
if(d=='二月初二') r.B += '春龙节(龙抬头) ', r.C += '畲族会亲节 ';
if(d=='二月初八') r.C += '傈傈族刀杆节 ';
if(d=='三月初三') r.B += '北帝诞 ', r.C += '苗族黎族歌墟节 ';
if(d=='三月十五') r.C += '白族三月街(至三月二十) ';
if(d=='三月廿三') r.B += '天后诞 妈祖诞 ';
if(d=='四月初八') r.B += '牛王诞 ';
if(d=='四月十八') r.C += '锡伯族西迁节 ';
if(d=='五月十三') r.B += '关帝诞 ', r.C += '阿昌族泼水节 ';
if(d=='五月廿二') r.C += '鄂温克族米阔鲁节 ';
if(d=='五月廿九') r.C += '瑶族达努节 ';
if(d=='六月初六') r.B += '姑姑节 天贶节 ', r.C += '壮族祭田节 瑶族尝新节 ';
if(d=='六月廿四') r.C += '火把节、星回节(彝、白、佤、阿昌、纳西、基诺族 ) ';
if(d=='七月初七') r.B += '七夕(中国情人节,乞巧节,女儿节 ) ';
if(d=='七月十三') r.C += '侗族吃新节 ';
if(d=='七月十五') r.B += '中元节 鬼节';
if(d=='九月初九') r.B += '重阳节 ';
if(d=='十月初一') r.B += '祭祖节(十月朝) ';
if(d=='十月十五') r.B += '下元节 ';
if(d=='十月十六') r.C += '瑶族盘王节 ';
if(d=='十二初八') r.B += '腊八节 ';
}
if(u.Lmc2=='正'){ //最后一月
if(d=='十二三十' && u.Ldn==30) r.A += '除夕 ',r.Fjia = 1;
if(d=='十二廿九' && u.Ldn==29) r.A += '除夕 ',r.Fjia = 1;
if(d=='十二廿三') r.B += '小年 ';
}
if(u.Ljq){
if(u.Ljq=="清明") r.A += u.Ljq+' ', r.Fjia = 1;
else r.B += u.Ljq+' ';
}
//农历杂节
var w,w2;
if(u.cur_dz>=0 && u.cur_dz<81){ //数九
w = obb.numCn[Math.floor(u.cur_dz/9)+1];
if(u.cur_dz%9==0) r.B += '『'+ w +'九』 ';
else r.C += w + '九第'+(u.cur_dz%9+1)+'天 ';
}
w = u.Lday2.substr(0,1);
w2= u.Lday2.substr(1,1);
if(u.cur_xz>20 && u.cur_xz<=30 && w=='庚') r.B += '初伏 ';
if(u.cur_xz>30 && u.cur_xz<=40 && w=='庚') r.B += '中伏 ';
if(u.cur_lq>0 && u.cur_lq<=10 && w=='庚') r.B += '末伏 ';
if(u.cur_mz>0 && u.cur_mz<=10 && w=='丙') r.B += '入梅 ';
if(u.cur_xs>0 && u.cur_xs<=12 &&w2=='未') r.B += '出梅 ';
},
getDayName:function(u,r){ //取某日节日,传入日对象
/****************
节日名称生成
传入日物件u
返回某日节日信息
r.A 重要喜庆日子名称(可将日子名称置红)
r.B 重要日子名称
r.C 各种日子名称(连成一大串)
r.Fjia 放假日子(可用于日期数字置红)
*****************/
var m0=(u.m<10?'0':'')+u.m;
var d0=(u.d<10?'0':'')+u.d;
var i,j,s,s2,type;
if(u.week==0||u.week==6) r.Fjia = 1; //星期日或星期六放假
//按公历日期查找
for(i=0;i<this.sFtv[u.m-1].length;i++){ //公历节日或纪念日,遍历本月节日表
s=this.sFtv[u.m-1][i];
if(s.substr(0,2)!=d0) continue;
s = s.substr(2,s.length-2);
type=s.substr(0,1);
if(s.substr(5,1)=='-'){ //有年限的
if( u.y<(s.substr(1,4)-0) || u.y>(s.substr(6,4)-0) ) continue;
s = s.substr(10,s.length-10);
} else {
if(u.y<1850) continue;
s = s.substr(1,s.length-1);
}
if(type=='#') r.A += s + ' ', r.Fjia = 1; //放假的节日
if(type=='I') r.B += s + ' '; //主要
if(type=='.') r.C += s + ' '; //其它
}
//按周查找
var w=u.weeki; if(u.week>=u.week0) w+=1;
var w2=w; if(u.weeki==u.weekN-1) w2=5;
w = m0 + w + u.week; //d日在本月的第几个星期某
w2= m0 + w2 + u.week;
for(i=0;i<this.wFtv.length;i++){
s=this.wFtv[i];
s2=s.substr(0,4);
if(s2!=w && s2!=w2) continue;
type=s.substr(4,1);
s = s.substr(5,s.length-5);
if(type=='#') r.A += s + ' ', r.Fjia = 1;
if(type=='I') r.B += s +' ';
if(type=='.') r.C += s + ' ';
}
},
getHuiLi:function(ob){ //回历计算
//以下算法使用Excel测试得到,测试时主要关心年临界与月临界
var z,y,m,d;
d = ob.d0 + 503105; z = int2((d+0.1)/10631); //10631为一周期(30年)
d -= z*10631; y = int2((d+0.5)/354.366); //加0.5的作用是保证闰年正确(一周中的闰年是第2,5,7,10,13,16,18,21,24,26,29年)
d -= int2(y*354.366+0.5); m = int2((d+0.11)/29.51); //分子加0.11,分每加0.01的作用是第354或355天的的月分保持为12月(m=11)
d -= int2(m*29.51+0.5);
ob.Hyear = z*30+y+1;
ob.Hmonth= m+1;
ob.Hday = d+1;
},
nnweek:function(y,m,n,w){ //求y年m月的第n个星期w的儒略日数
var jd = JD.JD(y,m,1.5); //月首儒略日
var w0 = (jd+1)%7; //月首的星期
var r = jd-w0+7*n+w; //jd-w0+7*n是和n个星期0,起算下本月第一行的星期日(可能落在上一月)。加w后为第n个星期w
if(w>=w0) r-=7; //第1个星期w可能落在上个月,造成多算1周,所以考虑减1周
if(n==5){
m++; if(m>12) m=1, y++; //下个月
if(r>=JD.JD(y,m,1.5)) r-=7; //r跑到下个月则减1周
}
return r;
},
substr2:function(s,n,end){ //截串(网页设计对过长的文字做截处理)
s=s.replace(/(^\s*)|(\s*$)/g, "");
if(s.length>n+1) return s.substr(0,n)+end;
return s;
},
qi_high:function(W){ //较高精度气
var t = XL.S_aLon_t2(W)*36525;
t = t - JD.deltatT2(t);
var v = ( (t+0.5) %1 ) * 86400;
if(v<600 || v >86400-600) t = XL.S_aLon_t(W)*36525 - JD.deltatT2(t);
return t + 8/24;
},
so_high:function(W){ //较高精度朔
var t = XL.MS_aLon_t2(W)*36525;
t = t - JD.deltatT2(t);
var v = ( (t+0.5) %1 ) * 86400;
if(v<600 || v >86400-600) t = XL.MS_aLon_t(W)*36525 - JD.deltatT2(t);
return t + 8/24;
},
qi_accurate : function(W) { var t=XL.S_aLon_t(W)*36525; return t - JD.deltatT2(t) + 8/24; }, //精气
so_accurate : function(W) { var t=XL.MS_aLon_t(W)*36525; return t - JD.deltatT2(t) + 8/24; }, //精朔
qi_accurate2: function(jd) { return this.qi_accurate ( Math.floor((jd+293)/365.2422*24) * Math.PI/12 ); }, //精气
so_accurate2: function(jd) { return this.so_accurate ( Math.floor((jd+8)/29.5306) * Math.PI*2 ); } //精朔
};
obb.init();
/************************
实气实朔计算器
适用范围 -722年2月22日——1959年12月
平气平朔计算使用古历参数进行计算
定朔、定气计算使用开普勒椭圆轨道计算,同时考虑了光行差和力学时与UT1的时间差
古代历算仅在晚期才使用开普勒方法计算,此前多采用一些修正表并插值得到,精度很低,与本程序中
的开普勒方法存在误差,造成朔日计算错误1千多个,这些错误使用一个修正表进行订正。同样,定气部分
也使用了相同的方法时行订正。
平气朔表的算法(线性拟合):
气朔日期计算公式:D = k*n + b , 式中n=0,1,2,3,...,N-1, N为该式适用的范围
h表示k不变b允许的误差,如果b不变则k许可误差为h/N
每行第1个参数为k,第2参数为b
public中定义的成员可以直接使用
*************************/
var SSQ={ //实朔实气计算器
//private成员定义
SB:'', //朔修正表
QB:'', //气修正表
suoKB : new Array( //朔直线拟合参数
1457698.231017,29.53067166, // -721-12-17 h=0.00032 古历·春秋
1546082.512234,29.53085106, // -479-12-11 h=0.00053 古历·战国
1640640.735300,29.53060000, // -221-10-31 h=0.01010 古历·秦汉
1642472.151543,29.53085439, // -216-11-04 h=0.00040 古历·秦汉
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -