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

📄 index.htm

📁 寿星万年历 基于天文算法的万年历 javascript 年代范围大 精度高
💻 HTM
📖 第 1 页 / 共 3 页
字号:

 //数据显示
 Cb_zb.innerHTML = s;
 Cal_zb.innerHTML=msc.toHTML(1);
}
function tu_cls_path(){
  tu1.init(Can1);
  tu1.mark.p_cls();
  tu1.mark.p_save();
}

function dfRS(ly){ //地方日食表生成
 var jd = JD.JD( year2Ayear(Cc_y.value), Cc_m.value-0, (Cc_d.value-0) ) - J2000;  //取屏幕时间
 if(ly==1) jd -=29.53;
 if(ly==2) jd +=29.53;
 if(ly==1||ly==2) jd = XL.MS_aLon_t2( Math.floor((jd+8)/29.5306)*pi2 )*36525 - curTZ/24 -JD.deltatT2(jd);

 //置时间
 var ts=JD.setFromJD_str(jd+J2000);
 Cc_y.value = ts.substr(0,5)-0;
 Cc_m.value = ts.substr(6,2);
 Cc_d.value = ts.substr(9,2);

 var i,j,t,c, ou='地名	初亏	食甚	复圆	食既	生光\r\n', s=Cc_db.innerText;
 s=s.replace(/\r\n/g,'#'); s=s.replace(/ /g,''); s=s.split('#');
 for(i=0;i<s.length;i++){
  c=s[i];         if(c.length==0||c.substr(0,1)=='*') continue;
  c=c.split(','); if(c.length<=3) continue;
  rsPL.secMax(jd,(c[2]-0)/180*Math.PI,(c[1]-0)/180*Math.PI,(c[3]-0)/1000);
  ou += c[0]+'['+rsPL.LX+']';
  for(j=0;j<5;j++){
   t  = rsPL.sT[j]; if(!t) continue;
   t -= curTZ/24+JD.deltatT2(t)+J2000; //转为UTC(本地时间)
   ou+='	'+JD.setFromJD_str(t).substr(12,8);
  }
  ou += '\r\n';
 }
 Cc_tb.innerText=ou;
}

//==========================
//页面生成有关的函数
//==========================
function showPage(pg){
  Cal_pause.checked=true;
  page1.style.display='none';
  page2.style.display='none';
  page3.style.display='none';
  page4.style.display='none';
  if(pg==1){page1.style.display='block'; Cal_pause.checked=false;}
  if(pg==2) page2.style.display='block';
  if(pg==3){page3.style.display='block'; tu_calc(0,0);} //图表
  if(pg==4) page4.style.display='block'; //地方日食
}

/********************
当前时间初始化,在屏幕上显示时间、保存本地时区信息等
*********************/
function set_date_screen(){ //把当前时间置于屏幕的便入框之中
 var now=new Date();
 curTZ = now.getTimezoneOffset()/60; //时区 -8为北京时
 curJD = now/86400000-10957.5 - curTZ/24; //J2000起算的儒略日数(当前本地时间)
 JD.setFromJD(curJD+J2000);

 Cml_y.value = JD.Y;
 Cml_m.value = JD.M;
 Cml_d.value = JD.D;
 Cml_his.value = JD.h+':'+JD.m+':'+JD.s.toFixed(0);

 Cal_y.value = JD.Y;
 Cal_m.value = JD.M;
 curJD=int2(curJD+0.5);
}
set_date_screen();

/****************
外地时间选择
****************/
function change_dq(){ //国家或地区改变
  var i,v = Sel_dq.options[Sel_dq.selectedIndex].value;
  v = v.split('#');
  Sel_dq.v = v[0]; //地区时差
  Sel_dq.rg= v[1]; //日光节约参数
  Sel_sqsm.innerHTML=v[2];  //时区说明
}

function change_zhou(){ //洲别改变
  var i, ob = SQv[ Sel_zhou.options[Sel_zhou.selectedIndex].value-0 ]; //某洲数组
  Sel_dq.length=0;
  for(i=1; i<ob.length; i+=2) addOp(Sel_dq,ob[i+1],ob[i]);
  change_dq();
}

for(i=0;i<SQv.length;i++) addOp(document.all.Sel_zhou,i,SQv[i][0]);
change_zhou();



function show_clock(t){ //显示时钟,传入日期对象
  var h  = Sel_dq.v-0, rg='';
  var v  = Sel_dq.rg;
  var jd = t/86400000-10957.5 + h/24; //J2000起算的儒略日数(当地时间)

  Clock1.innerHTML = t.toLocaleString();

  if(v){
   var y1 = JD.Y, y2=y1; //该时所在年份
   var m1 = v.substr(0,2)-0, m2 = v.substr(5,2)-0;
   if(m2<m1) y2++;
   //nnweek(y,m,n,w)求y年m月第n个星期w的jd
   var J1 = JD.nnweek( y1, m1, v.substr(2,1), v.substr(3,1)-0  )-0.5-J2000 +(v.charCodeAt(4)-97)/24;
   var J2 = JD.nnweek( y2, m2, v.substr(7,1), v.substr(8,1)-0  )-0.5-J2000 +(v.charCodeAt(9)-97)/24;
   if(jd>=J1 && jd<J2) jd+=1/24, rg='<font color=red>¤</font>';  //夏令时
  }
  JD.setFromJD(jd+J2000);
  Clock2.innerHTML = JD.D+'日 '+JD.h+':'+JD.m+':'+int2(JD.s) + rg; //与了与clock1同步,秒数取整而不四舍五入
}

/****************
地理经纬度选择的页面控制函数
****************/
function change2(){
  var i,v = new JWdecode( Sel2.options[Sel2.selectedIndex].value );
  Sel2.vJ = v.J; Sel2.vW = v.W;
  Cb_J.value=(v.J/Math.PI*180).toFixed(6), Cb_W.value=(v.W/Math.PI*180).toFixed(6);
  Cal_zdzb.innerHTML = '经度(向西为正) '+rad2str2(v.J) + ' 纬度 '+rad2str2(v.W);
  showMessD(-2);
  setCookie('Sel1',Sel1.selectedIndex);
  setCookie('Sel2',Sel2.selectedIndex);
}
function change(){
  Sel2.length=0; 
  var i, ob=JWv[ Sel1.options[Sel1.selectedIndex].value-0 ];
  for(i=1; i<ob.length; i++)
   addOp( Sel2, ob[i].substr(0,4), ob[i].substr(4,ob[i].length-4) );
  change2();
}
var i;
for(i=0;i<JWv.length;i++) addOp(document.all.Sel1,i,JWv[i][0]);

var seI1=getCookie('Sel1');
var seI2=getCookie('Sel2');
Sel1.selectedIndex = seI1; change();
Sel2.selectedIndex = seI2; change2();


/**********************
月历的年、月跳转控制函数
**********************/
function ML_calc(){
 var ob=new Object();
 var t = timeStr2hour(Cml_his.value);
 var jd=JD.JD(year2Ayear(Cml_y.value), Cml_m.value-0, Cml_d.value-0+t/24)
 obb.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 += '星期' + JD.Weeks[ob.week] + ' ' + ob.XiZ +'<br>';
  s += ob.Lyear3+'年 '+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 );
 }
}

/**********************

⌨️ 快捷键说明

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