中华农历论坛知识讨论区历法知识 → [分享]《电脑医生万年历》节气计算代码公开。


  共有23943人关注过本帖平板打印

主题:[分享]《电脑医生万年历》节气计算代码公开。

帅哥哟,离线,有人找我吗?
chwc
  1楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:603 积分:5315 威望:0 精华:4 注册:2008/4/21 19:06:00
[分享]《电脑医生万年历》节气计算代码公开。  发帖心情 Post By:2009/4/18 11:54:00

我的《电脑医生万年历》的内核是从‘知来者’或‘国日历类’修改而来,但由于‘知来者’或‘中国日历类’它设计上考虑不周到,好多地方节气显示出错。因此我对他进行改动,修改后从前104年到1645年平气和史实一样。同时也显示出定气。新代码在将在《电脑医生万年历》1.95版上开始用。《电脑医生万年历》1.95版在4月20号到5月7号之间发布到到:http://www.skycn.com/soft/50990.html 天空软件站戓到 http://www.newhua.com/soft/77731.htm 华军软件园;大家到时可去下载。

现在节气计算代码公开如下:

//-------數學函數------//
function PI(){
  return Math.PI;
}

function sin(x){
  return Math.sin(x);
}

function cos(x){
  return Math.cos(x);
}

function abs(x){
  return Math.abs(x);
}

function floor(x){
  return Math.floor(x);
}

function round(x){
  return Math.round(x);
}

function tail(x){
  return x-floor(x);
}

function rem(x,w){  //廣義求余
  return tail(x/w)*w;
}

//日差天數
function D0(y,m,d){
  var ifG=ifGr(y,m,d,1);
  var monL=new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
  if(ifG)
    if((y%100!=0&&y%4==0)||(y%400==0))
      monL[2]+=1;
    else ;
  else
    if(y%4==0)
      monL[2]+=1;
    else ;
  var v=0;
  for(var i=0;i<=m-1;i++){
    v+=monL[i];
  }
  v+=d;
  if(y==1582){
    if(ifG==1)
      v-=10;
    if(ifG==-1)
      v=1/0;  //infinity
  }
  return v;
}
//反日差天數
function antiD0(y,x){
  var m=1;
  for(var j=1;j<=12;j++){
    var mL=D0(y,j+1,1)-D0(y,j,1);
    if(x<=mL||j==12){
      var m=j;
      break;
    }
    else
       x-=mL;
  }
  return 100*m+x;
}
//年差天數
function D(y){
  var v=(y-1)*365+floor((y-1)/4);  //Julian的年差天數
  if(y>1582)
    v+=-floor((y-1)/100)+floor((y-1)/400);  //Gregorian的年差天數
  return v;
}
//等效標準天數
function erD(y,m,d){
  var v=(y-1)*365+floor((y-1)/4)+D0(y,m,d)-2;  //Julian的等效標準天數
  if(y>1582)
    v+=-floor((y-1)/100)+floor((y-1)/400)+2;  //Gregorian的等效標準天數
  return v;
}

///-----農暦節氣函數----/////
function S(y,n,pd){  //pd取值為0或1,分別表示平氣和定氣,該函數返回節氣的D0值
  var yk=365.2423112;///yk=365.2422226;0.00008894
  var jk=y-2100;
  var j=0.000088931/3400*jk;if(y<2200)j=0;
  var yk2=yk-j;
  var juD=y*(yk2-6.4e-14*(y-100)*(y-100)-3.047e-8*(y-100))+15.218427*n+1721050.71301;//儒略日
  var tht=3e-4*y-0.372781384-0.2617913325*n;//角度
  var yrD=(1.945*sin(tht)-0.01206*sin(2*tht))*(1.048994-2.583e-5*y);//年差實均數
  var shuoD=-18e-4*sin(2.313908653*y-0.439822951-3.0443*n);//朔差實均數
  var vs=(pd)?(juD+yrD+shuoD-erD(y,1,0)-1721425):(juD-erD(y,1,0)-1721425);
  return vs;
}
var ykche=new Array(///史實平氣擬合1
'1640650.479938','1642476.703182','1683430.515601','1752157.640664','1807675.003759','1883627.765182','1907369.128100','1936603.140413','1939145.524180','1947180.798300','1964362.041824','1987372.340971',
'1999653.819126','2007445.469786','2021324.917146','2047257.232342','2070282.898213','2073204.872850','2080144.500926','2086703.688963','2110033.182763','2111190.300888','2113731.271005','2120670.840263','2123973.309063',
'2125068.997336','2136026.312633','2156099.495538','2159021.324663','2162308.575254','2178485.706538','2178759.662849','2185334.020800','2187525.481425','2188621.191481')

var kche=new Array(///史實平氣擬合2
'-221','-216','-104','84','236','444','509','589','596','618','665','728','761','783','821','892','955','963','982','1000','1063','1067','1074','1093','1102','1105','1135','1190','1198','1207',
'1251','1252','1270','1276','1279');
var jkche=new Array(////史實平氣擬合3
'15.21842500','15.21874996',' 15.218750011','15.218749978','15.218620279','15.218612292','15.218449176','15.218425000','15.218466998',' 15.218524844','15.218533526','15.218513908','15.218530782',
'15.218535181','15.218526248','15.218519654','15.218425000','15.218515221','15.218530782','15.218523776','15.218425000','15.218425000','15.218515671','15.218425000','15.218425000','15.218477932','15.218472436',
'15.218425000','15.218425000','15.218461742','15.218425000','15.218445786','15.218425000','15.218425000','15.218437484');
var jkche2=new Array(///史實平氣擬合4
-3,-3,0,4,4,3,3,4,3,3,4,4,19,3,3,3,4,4,4,3,0,4,3,3,4,4,4,3,3,3,10,4,4,4,4);

function S2(y,m,d,n){  ///從-221到1645史實平氣,該函數返回史實平節氣的D0值
var jeJD=round(JD(y,m,d,20,0,0,8)*1000)/1000;  var ykd=(round(JD(y,1,1,20,0,0,8)*1000)/1000)-1;
var jkk=0;if(jeJD>1642468)jkk=1;if(jeJD>=1683438)jkk=2;if(jeJD>=1752164)jkk=3;
if(jeJD>=1807682)jkk=4;if(jeJD>=1883654)jkk=5;if(jeJD>=1907395)jkk=6;if(jeJD>=1936615)jkk=7;
if(jeJD>=1939172)jkk=8;if(jeJD>=1947207)jkk=9;if(jeJD>=1964374)jkk=10;if(jeJD>=1987385)jkk=11;
if(jeJD>=1999683)jkk=12;if(jeJD>=2007445)jkk=13;if(jeJD>=2021325)jkk=14;if(jeJD>=2047258)jkk=15;
if(jeJD>=2070297)jkk=16;if(jeJD>=2073219)jkk=17;if(jeJD>=2080158)jkk=18;if(jeJD>=2086705)jkk=19;
if(jeJD>=2110050)jkk=20;if(jeJD>=2111205)jkk=21;
if(jeJD>=2113733)jkk=22;if(jeJD>=2120673)jkk=23;if(jeJD>=2123988)jkk=24;
if(jeJD>=2125084)jkk=25;if(jeJD>=2136042)jkk=26;if(jeJD>=2156102)jkk=27;if(jeJD>=2159024)jkk=28;
if(jeJD>=2162311)jkk=29;if(jeJD>=2178503)jkk=30;if(jeJD>=2178776)jkk=31;if(jeJD>=2185350)jkk=32;
if(jeJD>=2187542)jkk=33;if(jeJD>=2188637)jkk=34;
   var yk2=ykche[jkk];///初數
  var k=kche[jkk];//年界
  var jk=jkche[jkk];////氣長
  var jk9=jkche2[jkk];///節差數
  var yk3=jk*(jk9*1);
  var yk=(yk2*1)-(yk3*1);
  var jq=jk*(n+(24*(y-k-1)));
  var vj=jq+yk-ykd+0.5;if(y<-220||y>1646||y==1646&&m>=1)vj='';
  return vj;
}
function jqi(y,m,d,a){
  var mL=D0(y,m+1,1)-D0(y,m,1);
  var yr2=''+y+'年';
  if(y<=0)
  yr2='前'+(-y+1)+'年';
  var sT00='';var sT0='';var sT1='';var sT2='';var sT3='';var sT4='';  var qSt='';var sDsStr1='';var ifsj1='';////節氣
  var sN00=2*m-3;
  var sDt00=S(y,sN00,1);if(a==3)sDt00=S2(y,m,d,sN00);
  var sD00=antiD0(y,floor(sDt00));
  var sM00=floor(sD00/100);   ///節氣交接公暦月。
  sDate00=sD00%100;
  var sN0=2*m-2;
  var sDt0=S(y,sN0,1);if(a==3)sDt0=S2(y,m,d,sN0);
  var sD0=antiD0(y,floor(sDt0));
  var sM0=floor(sD0/100);
  sDate0=sD0%100;
  sN1=2*m-1;
  var sDt1=S(y,sN1,1);if(a==3)sDt1=S2(y,m,d,sN1);
  var sD1=antiD0(y,floor(sDt1));
  var sM1=floor(sD1/100);
  sDate1=sD1%100;
  sN2=2*m;
  var sDt2=S(y,sN2,1);if(a==3)sDt2=S2(y,m,d,sN2);
  var sD2=antiD0(y,floor(sDt2));
  var sM2=floor(sD2/100);
  sDate2=sD2%100;
  var sN3=2*m+1;
  if(sN3>24)
  sN3=25;
  var sDt3=S(y,sN3,1);if(a==3)sDt3=S2(y,m,d,sN3);
  var sD3=antiD0(y,floor(sDt3));
  var sM3=floor(sD3/100);
  sDate3=sD3%100;

  sN00=rem(sN00-1,24)+1;sN0=rem(sN0-1,24)+1;sN1=rem(sN1-1,24)+1; sN2=rem(sN2-1,24)+1; sN3=rem(sN3-1,24)+1;
  if(sDate2>mL) sDate2-=mL; var jqk=D0(y,m,d);var qk00=floor(sDt00);
  var qk0=floor(sDt0);var qk1=floor(sDt1);var qk2=floor(sDt2);var qk3=floor(sDt3);
  if(qk00<D0(y,m,1)||qk00>D0(y,m,mL)) sN00='';
  if(qk0<D0(y,m,1)||qk0>D0(y,m,mL)) sN0='';
  if(qk1<D0(y,m,1)||qk1>D0(y,m,mL)) sN1='';
  if(qk2<D0(y,m,1)||qk2>D0(y,m,mL)) sN2='';
  if(qk3<D0(y,m,1)||qk3>D0(y,m,mL)) sN3='';//
  sT00='%公暦'+yr2+sM00+'月'+sDate00+'日'+'東8區'+dToStr(tail(sDt00))+' 定'+sStr(sN00)+'<br>';if(sN00=='') sT00='';
  sT0='*公暦'+yr2+sM0+'月'+sDate0+'日'+'東8區'+dToStr(tail(sDt0))+' 定'+sStr(sN0)+'<br>';if(sN0=='') sT0='';
  sT1='&公暦'+yr2+sM1+'月'+sDate1+'日'+'東8區'+dToStr(tail(sDt1))+' 定'+sStr(sN1)+'<br>';if(sN1=='') sT1='';
  sT2='$公暦'+yr2+sM1+'月'+sDate2+'日'+'東8區'+dToStr(tail(sDt2))+' 定'+sStr(sN2);if(sN2=='')sT2='';
  sT3='<br>'+'#公暦'+yr2+sM3+'月'+sDate3+'日'+'東8區'+dToStr(tail(sDt3))+' 定'+sStr(sN3);if(sN3=='')sT3='';
  var qSt5='';if(a==1)qSt5='定';if(a==2)qSt5='<font color=#808000>'+'◆</font>';
  if(jqk==qk00)if(sT00==''){sDsStr1='|'}else{sDsStr1=qSt5+sStr(sN00)+':東8區'+dToStr(tail(sDt00));}
  if(jqk==qk0)if(sT0==''){sDsStr1='|'}else{sDsStr1=qSt5+sStr(sN0)+':東8區'+dToStr(tail(sDt0));}
  if(jqk==qk1)if(sN1==''){sDsStr1='|'}else{sDsStr1=qSt5+sStr(sN1)+':東8區'+dToStr(tail(sDt1));}
  if(jqk==qk2)if(sN2==''){sDsStr1='|'}else{ sDsStr1=qSt5+sStr(sN2)+':東8區'+dToStr(tail(sDt2));} ///
  if(jqk==qk3)if(sT3==''){sDsStr1='|'}else{sDsStr1=qSt5+sStr(sN3)+':東8區'+dToStr(tail(sDt3));}
 
  if(jqk==qk00)if(sT00==''){qSt=''}else{qSt=qSt5+sStr(sN00);}
  if(jqk==qk0)if(sT0==''){qSt=''}else{qSt=qSt5+sStr(sN0);}
  if(jqk==qk1)if(sT1==''){qSt=''}else{qSt=qSt5+sStr(sN1);}
  if(jqk==qk2)if(sT2==''){qSt=''}else{ qSt=qSt5+sStr(sN2);}
  if(jqk==qk3)if(sT3==''){qSt=''}else{qSt=qSt5+sStr(sN3);}
  if(a==1){return sDsStr1;}else{
  if(a==2){return qSt;}else{
  if(a==3){return qSt;}else{
  return sT00+sT0+sT1+sT2+sT3;}}}
  }/////節氣計算結束

  /////////以下是应用
/////右则显示应用
  jieqi.innerHTML=jqi(y1,m1,d1);  ////顯節氣交節時間


///////月历显示应用
 
      var sjq2='';var sjq0=jqi(y,m,dateNum[i],2);
      if(y>=-220&&y<1646&&sjq0>''||y==1646&&m<1&&sjq0>'')sjq0='<font color=#808000>'+'◆</font>';
      var sjq1=jqi(y,m,dateNum[i],3); var sjq=sjq0+sjq1;
      if(sjq>'')
      lunString='<br>'+lunDStr(lunNum[i])+'<br><font color=#008800>'+sjq+'</font>';  
      if(sjq>'' && lunNum[i]==1)
      lunString='<br>'+lunyMon+lunMStr(lunMonth[i])+'月'+dasaoh+'<br><font color=#008800>'+sjq+'</font>';
      if(sjq>'' && dateNum[i]==1&&lunNum[i]>=29)
      lunString='<br>'+lunDStr(lunNum[i])+'<br><font color=#008800>'+sjq+'</font>';

/////////////////////////////////////////////////////////


 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:氣計算.txt


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

[分享]《电脑医生万年历》节气计算代码公开。








签名