⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 index.htm

📁 寿星万年历是一款采用现代天文算法制作的农历历算程序
💻 HTM
📖 第 1 页 / 共 2 页
字号:
function ML_calc(){
 var ob=new Object();
 var t = String(Cml_his.value).split(':');
 t[0]-=0; t[1]-=0; t[2]-=0; t=(t[2]/60+t[1])/60+t[0];
 var jd=JD.JD(Cml_y.value-0, Cml_m.value-0, Cml_d.value-0+t/24)
 mingLiBaZi( jd+curTZ/24-J2000, Sel2.vJ, ob ); //八字计算
 Cal6.innerHTML =
     '<font color=red>  <b>[日标]:</b></font>'+'公历 '+Cml_y.value+'-'+Cml_m.value+'-'+Cml_d.value + ' 儒略日数 ' + int2(jd+0.5) + ' 距2000年首' + int2(jd+0.5-J2000) + '日<br>'
   + '<font color=red  ><b>[八字]:</b></font>'    + ob.bz_jn+'年 '+ob.bz_jy+'月 '+ob.bz_jr+'日 '+ob.bz_js+'时 真太阳 <font color=red>' + ob.bz_zty+ '</font><br>'
   + '<font color=green><b>[纪时]:</b></font><i>' + ob.bz_JS + '</i><br>'
   + '<font color=green><b>[时标]:</b></font><i>' + '23  01  03  05  07  09  11  13  15  17  19  21  23';
}
ML_calc(); //在时间、地标初始化完成后就可执行

/**********************
月历的年、月跳转控制函数
**********************/

function changeYear(ud){ //跳到上(或下)一年
 var y = year2Ayear(Cal_y.value);
 if(y==-10000) return;
 if(ud==0){
   if(y<=-4712) { alert('到顶了!'); return; }
   Cal_y.value = Ayear2year(y-1);
 }else{
   if(y>=9999) { alert('到顶了!'); return; }
   Cal_y.value = Ayear2year(y+1);
 }
 getLunar();
}
function changeMonth(ud){ //跳到上(或下)下月
 var y,m;
 y = year2Ayear(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 = Ayear2year(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 = Ayear2year(y+1);
   else      Cal_m.value = m+1;
 }
 if(ud==2) { set_date_screen(); ML_calc(); }
 getLunar();
}



/********************
即时坐标计算等
*********************/

function zb_calc(){
  if(Cal_pause.checked) return;

  var now = new Date();
  var jd = now/86400000-10957.5; //J2000起算的儒略日数
  jd += JD.deltatT2(jd);
  msc.calc(jd, Sel2.vJ-0, Sel2.vW-0,0); //传入力学时间(J2000.0起算)
  Cal_zb.innerHTML = msc.toHTML(0);
}


function RTS1(jd,vJ,vW,tz){
 SZJ.calcRTS(jd, 1, vJ, vW, tz); //升降计算,使用北时时间,tz=-8指东8区,jd+tz应在当地正午左右(误差数小时不要紧)
 var s, ob = SZJ.rts[0];
 JD.setFromJD(jd+J2000);
 s  = '日出 <font color=red>'+ob.s + '</font> 日落 '+ob.j +' 中天 '+ob.z +'<br>';
 s += '月出 '+ob.Ms+ ' 月亮 '+ob.Mj+' 月中 '+ob.Mz+'<br>';
 s += '晨起天亮 '+ob.c + ' 晚上天黑 '+ob.h +'<br>';
 s += '日照时间 '+ob.sj+ ' 白天时间 '+ob.ch+'<br>';
 return s;
}


/**********************
日历(某日)信息页面生成
**********************/
function showMessD(n){ //显时本月第n日的摘要信息。调用前应先执月历页面生成,产生有效的lun对象
 if(event){ if(event.ctrlKey) return; }
 if(!lun.dn||n>=lun.dn) return;
 var vJ = Sel2.vJ-0, vW = Sel2.vW-0;

 if(n==-1){ //鼠标移出日期上方
   Cal_pan.style.display = 'none';
   Cal5.innerHTML = Cal5.bak;
 }
 if(n==-2) Cal5.bak = Cal5.innerHTML = RTS1(curJD, vJ, vW, curTZ);
 if(n<0) return;
 //显示n指定的日期信息
 var ob = lun.lun[n];
 Cal5.innerHTML = RTS1(ob.d0, vJ, vW, curTZ);

 if(window.event && window.event.srcElement.tagName=='SPAN'){ //鼠标移过日期上方
  s  = Ayear2year(ob.y) + '年' + ob.m + '月' + ob.d + '日<br>'
  s += '星期' + obb.Weeks[ob.week] + ' ' + ob.XiZ +'<br>';
  s += ob.Lleap + ob.Lmc + '月' + (ob.Ldn>29?'大 ':'小 ') + ob.Ldc + '日<br>';
  s += ob.Lyear2+'年 '+ob.Lmonth2+'月 '+ob.Lday2+'日<br>';
  s += '回历['+ob.Hyear+'年'+ob.Hmonth+'月'+ob.Hday+'日]<br>';
  if(ob.yxmc) s += ob.yxmc+' '+ob.yxsj+' ';
  if(ob.jqmc) s += '定'+ob.jqmc+' '+ob.jqsj+'<br>';
  else { if(ob.Ljq) s += ob.Ljq+'<br>';}
  if(ob.A)    s += ob.A +' ';
  if(ob.B)    s += ob.B +' ';
  if(ob.C)    s += ob.C;
  Cal_pan.style.display = 'block'; //先显示再传值屏幕流畅
  Cal_pan_in.innerHTML = s;
  Cal_pan.style.left = window.event.x+document.body.scrollLeft + ( (ob.week>3) ? -180 : 20 );
  Cal_pan.style.top  = window.event.y+document.body.scrollTop  - ( (ob.weeki<2)?    0 :100 );
 }
}

/**********************
月历页面生成
**********************/
function getLunar(){ //月历页面生成

  var By  = year2Ayear(Cal_y.value);
  var Bm  = Cal_m.value-0;
  if(By == -10000) return;

  if(!lun.dn || lun.y!=By || lun.m!=Bm){  //月历未计算
   lun.yueLiHTML(By,Bm,curJD);
   Cal2.innerHTML = lun.pg0;
   page1.innerHTML = lun.pg1;
   Cal4.innerHTML = lun.pg2;
  }

  showMessD(-2);
}

getLunar(); //调用月历页面生成函数

/**********************
年历面页生成
**********************/
function getNianLi(dy){
 y=year2Ayear(Cal_y2.value);
 if(y==-10000) return;
 y+=dy;
 Cal_y2.value = Ayear2year(y);
 if(y<-4712) { alert('到底了'); return; }
 if(Cal_tg.checked) Cal7.innerHTML=Ayear2year(y)+'年<br>'+nianLiHTML(y);
 else               Cal7.innerHTML=Ayear2year(y)+'年<br>'+nianLi2HTML(y);
}

/**********************
时钟1秒定时
**********************/
function tick() { //即时坐标计算
  var now = new Date();
  show_clock(now);
  zb_calc();
  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(); //坐标数组

 msc.calc(T,I_dlLon.value/180*Math.PI,I_dlLat.value/180*Math.PI,0); //坐标测试
 s += msc.toHTML(1);

 //月球迭代算法测试
 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 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>
<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><div id=out></div></td></tr>
</table>


</center>
</body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -