📄 index.htm
字号:
if(bak){
Cal5.bak=Cal5.innerHTML;
Cal6.bak=Cal6.innerHTML;
}
}
function strTu(s,n){ //截串
s = trim(s);
if(s.length>n+1) return s.substr(0,n)+'..';
return s;
}
function getLunar(){ //月历页面生成
var i,j, c,c2, cr="",isM;
var lun = Lunar.lun, ob; //日历物件
var By = get_year_screen(Cal_y.value);
var Bm = Cal_m.value-0;
if(By == -10000) return;
Lunar.calc2(By,Bm,1); //农历计算
//年份处理
Cal2.innerHTML = lun.nianhao.nh+' 农历'+lun.Ly+'年【'+lun.ShX+'年】'; //干支纪年
//月历处理
var ta0='';
for(i=0;i<lun.dn;i++){ //遍历本月各日(公历)
//生成i日的日历页面
ob = lun[i];
if(!i){ for(j=0;j<lun.w0;j++) cr+='<td></td>'; } //首行前面的空单元格
c = '', isM = ''; //文字格式控制项
if(ob.Ljq) c += '<font color=blue>'+ob.Ljq+'</font>'; //取节气
if(ob.A) c += '<font color=red>' +strTu(ob.A,4)+'</font>';
if(!c && ob.B) c = '<font color=blue>'+strTu(ob.B,4)+'</font>';
if(!c && ob.Ldc=="初一") c = ob.Lleap + ob.Lmc +'月'+ (ob.Ldn==30?'大':'小'); //农历历月(闰月及大小等)
if(!c) c = ob.Ldc; //取农历日名称
if(ob.yxmc=="朔") isM = '<font color=#808000>●</font>'; //取月相
if(ob.yxmc=="望") isM = '<font color=#F0B000>●</font>'; //取月相
if(ob.jqmc) isM += '<font color=#00C000>◆</font>'; //定气标记
if(ob.Fjia) c2 = 'class=da2'; else c2 = 'class=da'; //节日置红色
c2 += ' onmouseover="showMessD('+i+',0)"';
c2 += ' onmouseout ="showMessD(-1,0)"';
c2 = '<span ' + c2 + '>' +ob.d + '</span>'; //公历的日名称
if(nowY==By && nowM==Bm && nowD==ob.d){
c2='<span class=cur>'+c2+'</span>'; //今日标识
showMessD(i,1);
}
cr += '<td class=body width="14%">'+c2+'<br>'+isM+c+'</td>';
if(i==lun.dn-1) { for(j=0;j<6-ob.week;j++) cr+='<td></td>'; } //末行后面的空单元格
if(i==lun.dn-1||ob.week==6) ta0+='<tr>'+cr+'</tr>', cr="";
}
Cal3.innerHTML='<table border=0 cellpadding=3 cellspacing=2 width="100%">'+ta0+'</table>';
var b1='<b>月首:</b>',b2='<b>朔望:</b>',b3='<b>弦月:</b>',b4='<b>定气:</b>';
for(i=0;i<Lunar.lun.dn;i++){
ob=Lunar.lun[i];
c = i+1; if(c<10) c=' '+c;
if(ob.Ldc =='初一') b1 += c +'日 '+ob.Lleap+ob.Lmc+'月' + (ob.Ldn==30?'大':'小')+' ';
if(ob.yxmc=='朔' ||ob.yxmc=="望" ) b2 += c +'日 ' + ob.yxsj + ob.yxmc + '月 ';
if(ob.yxmc=='上弦'||ob.yxmc=="下弦") b3 += c +'日 ' + ob.yxsj + ob.yxmc + ' ';
if(ob.jqmc) b4 += c +'日 ' + ob.jqsj + ob.jqmc + ' ';
}
Cal4.innerHTML=b1+'<br>'+b2+'<br>'+b3+'<br>'+b4;
//以下显示背景年月
YMBG.innerHTML=Lunar.lun.y+'<br>'+monthName[Lunar.lun.m-1];
YMBG.style.left = getLeft(Cal3)+70;
YMBG.style.top = getTop(Cal3) -40;
}
getLunar(); //调用月历页面生成函数
/**********************
年历生成
**********************/
function getNianli(fs){
var y=get_year_screen(Cal_y.value);
if(fs==1) Cal3.innerHTML=nianLiHTML(y);
if(fs==2) Cal3.innerHTML=nianLi2HTML(y);
}
/**********************
月历的年、月跳转控制函数
**********************/
function changeYear(ud){ //跳到上(或下)一年
var y = get_year_screen(Cal_y.value);
if(y==-10000) return;
if(ud==0){
if(y<=-4712) { alert('到顶了!'); return; }
Cal_y.value = set_year_screen(y-1);
}else{
if(y>=9999) { alert('到顶了!'); return; }
Cal_y.value = set_year_screen(y+1);
}
getLunar();
}
function changeMonth(ud){ //跳到上(或下)下月
var y,m;
y = get_year_screen(Cal_y.value);
m = Cal_m.value-0;
if(ud==0){
if(m<=1 && y<=-4712) { alert('到顶了!'); return; }
if(m<=1) Cal_m.value = 12, Cal_y.value = set_year_screen(y-1);
else Cal_m.value = m-1;
}
if(ud==1){
if(m>=12 && y>=9999) { alert('到顶了!'); return; }
if(m>=12) Cal_m.value = 1, Cal_y.value = set_year_screen(y+1);
else Cal_m.value = m+1;
}
if(ud==2){
Cal_y.value = nowY;
Cal_m.value = nowM;
}
getLunar();
}
function zb_calc2() { //手动坐标计算
var ct=Cal_T.value;
if(ct.length!=20) {alert('时间串的长度不正确'); return;}
JD.Y=ct.substr(0,5)-0;
JD.M=ct.substr(6,2)-0;
JD.D=ct.substr(9,2)-0;
JD.h=ct.substr(12,2)-0;
JD.m=ct.substr(15,2)-0;
JD.s=ct.substr(18,2)-0;
ct=JD.toJD()-J2000;
Cal_zb.innerHTML = zb_calc(ct, Sel2.vJ-0, Sel2.vW-0); //传入UT时间(J2000.0起算)
}
function tick() { //即时坐标计算
var now = new Date();
var jd = now/86400000-10957.5; //J2000起算的儒略日数
Clock1.innerHTML = now.toLocaleString();
change_dq_time(jd);
if(!Cal_pause.checked){
var dt = JD.deltatT2(jd); //TD-UT
var ct = jd+dt;
JD.setFromJD(ct+J2000);
Cal_T.value = JD.toStr();
Cal_zb.innerHTML = zb_calc(ct, Sel2.vJ-0, Sel2.vW-0); //传入力学时间(J2000.0起算)
}
window.setTimeout("tick()", 1000);
}
tick(); //触发时钟
</script>
<!--
以下部分是工具函数等与日历无直接关系,如果不需要可以删除
1、测试工具
2、说明书
-->
<script language=javascript>
function K_getJD(){
JD.Y = Iy.value-0;
JD.M = Im.value-0;
JD.D = Id.value-0;
JD.h = Ih.value-0;
JD.m = Ii.value-0;
JD.s = Is.value-0;
return JD.toJD();
}
function testDD(UT){ //坐标测试
var s="",T,T2,dt;
T=(K_getJD()-J2000); //力学时
if(UT){
T += JD.deltatT2(T)-8/24;
}
z=new Array(),z2=new Array(); //坐标数组
s += zb_calc(T,I_dlLon.value-0,I_dlLat.value-0); //坐标测试
//月球迭代算法测试
L =XL.M_Lon(T/36525,-1); //正算
T2=XL.M_Lon_t(L)*36525; //反算
dt=(T2-T)*86400;
s += "<b>月球迭代算法测试:</b><br>";
s += "高速迭代法求指定Date平分点黄经的发生时刻。测试如下:<br>";
s += "输入时间(日数):" + T + "<br>";
s += "月球黄经(弧度):" + L + "<br>";
s += "反算时间(日数):" + T2 + "<br>";
s += "迭代误差(秒):" +dt +"<br><br>";
//地球迭代算法测试
L=XL.E_Lon(T/36525,-1);
T2=XL.E_Lon_t(L)*36525;
dt=(T2-T)*86400;
s += "<b>地球迭代算法测试:</b><br>";
s += "输入时间(日数):"+T+"<br>";
s += "地球黄经(弧度):"+L+"<br>";
s += "反算时间(日数):"+T2+"<br>";
s += "迭代误差(秒):"+dt+"<br><br>";
L=XL.MS_aLon(T/36525,-1,60); //-1表示月球序列全部计算,60表示地球序列只算60项就可以了
T2=XL.MS_aLon_t(L)*36525;
dt=(T2-T)*86400;
s += "月日黄经差返算迭代的时间误差(秒):" + dt + "<br><br>";
out.innerHTML=s;
}
function szj(){
SZJ.L = I_dlLon.value/180*Math.PI; //设置站点参数
SZJ.fa = I_dlLat.value/180*Math.PI;
var d0 = int2(K_getJD()+0.5);
var s="", r;
r=SZJ.St(d0-J2000-8/24);
JD.setFromJD(r.s+J2000+8/24); s +="太阳升起 " + JD.toStr()+"<br>";
JD.setFromJD(r.z+J2000+8/24); s +="太阳中天 " + JD.toStr()+"<br>";
JD.setFromJD(r.j+J2000+8/24); s +="太阳降落 " + JD.toStr()+"<br>";
JD.setFromJD(r.c+J2000+8/24); s +="民用天亮 " + JD.toStr()+"<br>";
JD.setFromJD(r.h+J2000+8/24); s +="民用天黑 " + JD.toStr()+"<br>";
s +="白天长度 " + (r.h-r.c)*24 + "小时<br>";
r=SZJ.Mt(d0-J2000-8/24);
JD.setFromJD(r.s+J2000+8/24); s +="月亮升起 " + JD.toStr()+"<br>";
JD.setFromJD(r.z+J2000+8/24); s +="月亮中天 " + JD.toStr()+"<br>";
JD.setFromJD(r.j+J2000+8/24); s +="月亮降落 " + JD.toStr()+"<br>";
out.innerHTML=s;
}
function dingQi_cmp(){ //定气误差测试
var i,T,maxT=0;
var y=year.value-2000;
var N=testN.value-0;
for(i=0;i<N;i++){
W = (y+i/24)*2*Math.PI;
T= XL.S_aLon_t2( W ) - XL.S_aLon_t( W ); //节气粗算与精算的差异
T = int2( Math.abs(T*36525*86400) );
if( T>maxT ) maxT=T;
}
out.innerHTML = (2000+y)+"年之后"+N+"个节气粗算与精算的最大差异:"+maxT+"秒。";
out.innerHTML = '<font color=red>' + out.innerHTML + '</font>';
}
function dingSuo_cmp(){ //定朔测试函数
var i,T,maxT=0;
var y=year.value-2000;
var N=testN.value-0;
var n=int2(y*(365.2422/29.53058886)); //截止当年首经历朔望的个数
for(i=0;i<N;i++){
W = (n+i/24)*2*Math.PI;
T= XL.MS_aLon_t2( W ) - XL.MS_aLon_t( W ); //合塑粗算与精算的差异
T = int2( Math.abs(T*36525*86400) );
if( T>maxT ) maxT=T;
}
out.innerHTML = (2000+y)+"年之后"+N+"个朔日粗算与精算的最大差异:"+maxT+"秒。";
out.innerHTML = '<font color=red>' + out.innerHTML + '</font>';
}
function dingQi_v(){ //定气计算速度测试
var d1=new Date(); for(i=0;i<1000;i++) XL.S_aLon_t(0);
var d2=new Date(); for(i=0;i<1000;i++) XL.S_aLon_t2(0);
var d3=new Date();
out.innerHTML = "高精度:"+(d2-d1)+"毫秒/千个<br>"
+ "低精度:"+(d3-d2)+"毫秒/千个<br>";
out.innerHTML = '<font color=red>' + out.innerHTML + '</font>';
}
function dingSuo_v(){ //定朔计算速度测试
var d1=new Date(); for(i=0;i<1000;i++) XL.MS_aLon_t(0);
var d2=new Date(); for(i=0;i<1000;i++) XL.MS_aLon_t2(0);
var d3=new Date();
out.innerHTML = "高精度:"+(d2-d1)+"毫秒/千个<br>"
+ "低精度:"+(d3-d2)+"毫秒/千个<br>";
out.innerHTML = '<font color=red>' + out.innerHTML + '</font>';
}
function getLunar2(){ //年历生成
var k, y=year.value-0, n=testN.value-0, s='红色表示定气或定朔与实历不同<br>';
var s1,s2;
var d1 = new Date();
for(k=0;k<n;k++) s += nianLiHTML(y+k)+'<br>';
var d2 = new Date();
out.innerHTML='计算'+n+'年日历总用时:'+(d2-d1)+'毫秒。<br>'+s;
}
function dingSuo(jiao){ //定朔测试函数
if(jiao==-1) jiao=prompt("请输入角度(0朔,90上弦,180望,270下弦,或其它):",0)-0;
var i,n,T,s="月-日黄经差"+jiao+"<br>", s2="";
var y=year.value-2000;
var N=testN.value-0;
for(i=0;i<N;i++){
n=int2(y*(365.2422/29.53058886)); //截止当年首经历朔望的个数
T=XL.MS_aLon_t( (n+i+jiao/360)*2*Math.PI ); //精确时间计算,入口参数是当年各朔望黄经
JD.setFromJD(T*36525+J2000+8/24-JD.deltatT2(T)); //力学时转为协调世时,式中8/24是时区
s2+=JD.toStr()+"<br>"; //日期转为字串
if(i%50==0) s+=s2,s2="";
}
out.innerHTML=s+s2;
}
function dingQi(){ //定气测试函数
var i,T,s="",s2="";
var y=year.value-2000;
var N=testN.value-0;
for(i=0;i<N;i++){
T = XL.S_aLon_t( (y+i/24)*2*Math.PI ); //精确节气时间计算
JD.setFromJD(T*36525+J2000+8/24-JD.deltatT2(T)); //力学时转为协调世时,式中8/24是时区
s2+="视黄经"+(i/24)*360+":"+JD.toStr()+"<br>"; //日期转为字串
if(i%50==0) s+=s2,s2="";
}
out.innerHTML=s+s2;
}
function K_show(f){
pan_1.style.display='none';
pan_2.style.display='none';
if(f==1) pan_1.style.display='block';
if(f==2) pan_2.style.display='block';
out.innerHTML='';
}
</script>
<br>
<table width=770 border=0 cellpadding=3 cellspacing=0>
<tr><td class=body2 align=center>
[<a href="javascript:dingQi_v();">定气速度测试</a> <a href="javascript:dingSuo_v();">定朔速度测试</a>]
[<a href='javascript:K_show(1)'>气朔计算</a> <a href='javascript:K_show(2)'>坐标计算</a> <a href='javascript:K_show(0)'>清空</a>]
</td></tr>
<tr><td class=body2>
<div id=pan_1 style='display:none'>
年首 <input type=text size=4 id=year value=2000>
个数 <input type=text size=3 id=testN value=10>
<input type=button value=定朔 onclick=dingSuo(0)>
<input type=button value=定望 onclick=dingSuo(180)>
<input type=button value=定气 onclick=dingQi()>
<input type=button value=任意月相 onclick=dingSuo(-1)>
<input type=button value=粗定气误差 onclick=dingQi_cmp()>
<input type=button value=粗定朔误差 onclick=dingSuo_cmp()>
<input type=button value=精算年历 onclick=getLunar2()>
</div>
<div id=pan_2 style='display:none'>
<input type=text size=5 id=Iy value=2008>年
<input type=text size=2 id=Im value=1>月
<input type=text size=2 id=Id value=1>日
<input type=text size=2 id=Ih value=0>时
<input type=text size=2 id=Ii value=0>分
<input type=text size=2 id=Is value=0>秒
<a href="javascript:testDD(0);">坐标计算(TD)</a>
<a href="javascript:testDD(1);">坐标计算(UT)</a>
地理经度:<input type=text size=8 id=I_dlLon value="-116.383">
地理纬度:<input type=text size=6 id=I_dlLat value="39.9">
<a href="javascript:szj()">日月升降(UT)</a>
</div>
</td></tr>
<tr><td class=body2><div id=out></div></td></tr>
</table>
</center>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -