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


  共有26039人关注过本帖树形打印

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

帅哥哟,离线,有人找我吗?
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单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
chwc
  2楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:603 积分:5315 威望:0 精华:4 注册:2008/4/21 19:06:00
  发帖心情 Post By:2009/4/20 1:13:00

更正:

function jqi(y,m,d,a){到
   return sT00+sT0+sT1+sT2+sT3;}}}
  }/////節氣計算結束
中的:var mL=D0(y,m+1,1)-D0(y,m,1);
更正为:var mL=D0(y,m+1,1)-D0(y,m,1);if(y==1582&&m==10)mL=31;
中的:var sM2=floor(sD2/100);
  sDate2=sD2%100;
更正为:var sM2=floor(sD2/100);
  sDate2=sD2%100;if(y==1582&&m==10)sDate2=sDate2+10;
中的:sT2='$公暦'+yr2+sM1+'月'+sDate2+'日'+'東8區'+dToStr(tail(sDt2))+' 定'+sStr(sN2);if(sN2=='')sT2='';

更正为:sT2='$公暦'+yr2+sM2+'月'+sDate2+'日'+'東8區'+dToStr(tail(sDt2))+' 定'+sStr(sN2);if(sN2=='')sT2='';


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
chwc
  3楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:603 积分:5315 威望:0 精华:4 注册:2008/4/21 19:06:00
  发帖心情 Post By:2009/5/9 20:09:00

/////月相,日月食
function shwStr(y,m,d,s1){
  var t=(y-1899.5)/100;
  var ms=floor((y-1900)*12.3685);
  var rpi=180/PI();
  var zone=8;  //時區
  var f0=ang(ms,t,0,0.75933,2.172e-4,1.55e-7)+0.53058868*ms-8.37e-4*t+zone/24+0.5;
  var fc=0.1734-3.93e-4*t;
  var j0=693595+29*ms;
  var aa0=ang(ms,t,0.08084821133,359.2242/rpi,0.0000333/rpi,0.00000347/rpi);
  var ab0=ang(ms,t,7.171366127999999e-2,306.0253/rpi,-0.0107306/rpi,-0.00001236/rpi);
  var ac0=ang(ms,t,0.08519585128,21.2964/rpi,0.0016528/rpi,0.00000239/rpi);
  var ecli='';  //日月食
  var lunD=-1;  //農暦日數
  var shuoD=0;  //本陰暦月的陰暦朔日數
  var shuoT=0;  //本陰暦月的朔時刻
  var shanxD=0;  //本陰暦月的望時刻
  var shanxT=0;  //本陰暦月的陰暦望日數
  var wangD=0;  //本陰暦月的望時刻
  var wangT=0;  //本陰暦月的陰暦望日數
  var xiaxD=0;  //本陰暦月的望時刻
  var xiaxT=0;  //本陰暦月的陰暦望日數
  /////
  for(var k=-1;k<=13;k+=0.25){  //k=整數為朔,k=半整數為望
    var aa=aa0+0.507984293*k;
    var ab=ab0+6.73377553*k;
    var ac=ac0+6.818486628*k;
    var f1=f0+1.53058868*k+fc*sin(aa)-0.4068*sin(ab)+0.0021*sin(2*aa)+0.0161*sin(2*ab)+0.0104*sin(2*ac)-0.0074*sin(aa-ab)-0.0051*sin(aa+ab);
    var j=j0+28*k+f1;  //朔或望的等效標準天數及時刻
    //記錄當前日期的j值
    var lunD0=erD(y,m,d)-floor(j);  //當前日距朔日的差值
    if(k==floor(k)&&lunD0>=0&&lunD0<=29){
      var k1=k;  //記錄當前時間對應的k值
      shuoT=tail(j);
      lunD=lunD0+1;
   ///月相的错误校正(1901-2050)
      if(y==1924&&m==3&&d==5) shuoT=0.99932;
      if(y==2018&&m==11&&d==8||y==2057&&m==9&&d==29||y==2097&&m==8&&d==8) shuoT=0.0006;
    ///////1924.3.5-4.3 错误修正
    if(y==1924&&((m==3&&d>=5)&&(m==3&&d<=7))){
    lunD++;
    if(lunD>30){
    lunD = lunD-=30;
    }}
  //2018.11.7-12.6 - 2057.9.28-10.27 - 2097.8.7-9.5  错误修正
  if(y==2018&&((m==11&&d>=7)&&(m==11&&d<=9))||y==2057&&((m==9&&d>=28)&&(m==9&&d<=29))||y==2097&&((m==8&&d>=7)&&(m==8&&d<=10))){
   lunD--;
    if(lunD<1){
    lunD = lunD+=30;
    }
  }
    }
    if(k==(k1+0.25)){
      shanxT=tail(j); 
      shanxD=floor(j)-(erD(y,m,d)-lunD+1)+1;
    }
    if(k==(k1+0.5)){
      wangT=tail(j); 
      wangD=floor(j)-(erD(y,m,d)-lunD+1)+1;
    }
    if(k==(k1+0.75)){
      xiaxT=tail(j); 
      xiaxD=floor(j)-(erD(y,m,d)-lunD+1)+1;
    }
     //判斷日月食
    if((lunD==1&&k==k1)||(lunD==wangD&&k==(k1+0.5))){
      if(abs(sin(ac))<=0.36){
        var s=5.19595-0.0048*cos(aa)+0.002*cos(2*aa)-0.3283*cos(ab)-0.006*cos(aa+ab)+0.0041*cos(aa-ab);
        var r=0.207*sin(aa)+0.0024*sin(2*aa)-0.039*sin(ab)+0.0115*sin(2*ab)-0.0073*sin(aa+ab)-0.0067*sin(aa-ab)+0.0117*sin(2*ac);
        var p=abs(s*sin(ac)+r*cos(ac));
        var q=0.0059+0.0046*cos(aa)-0.0182*cos(ab)+0.0004*cos(2*ab)-0.0005*cos(aa+ab);
        if(p-q<=1.5572){
          ecli='(日食)';  //日食
          if(k!=floor(k)){
            if(p+q>=1.0129)
              ecli='(月偏食)';  //月偏食
            else
              ecli='(月全食)';  //月全食
          } } } } }
   //k循環結束
 if(y==1924&&m==3&&d==5)ecli='(日食)';////日食错误修正
  var str='';
  var v1=lunD;
  if(s1==0){
  if(v1==1)////日曆部份月相
    str='東8區'+dToStr(shuoT)+'朔<font color="#666666">●</font>'+ecli;
  else
    if(v1==shanxD)//(v1==15||v1==16)&&v2)
      str='東8區'+dToStr(shanxT)+'上弦<img border="0" src="7000wnldat/shanx.jpg" width="12" height="12">';
    else
    if(v1==wangD)//(v1==15||v1==16)&&v2)
      str='東8區'+dToStr(wangT)+'望<font color="#FF0000">○</font>'+ecli;
    else
    if(v1==xiaxD)//(v1==15||v1==16)&&v2)
      str='東8區'+dToStr(xiaxT)+'下弦<img border="0" src="7000wnldat/xiax.jpg" width="12" height="12">';
    else;
    }else{ 
  if(v1==1||v1==101||v1==201)///月曆部份月相
    str='<font color="#666666">●</font>';
  else
    if(v1==shanxD)//(v1==15||v1==16)&&v2)
      str='<img border="0" src="7000wnldat/shanx.jpg" width="12" height="12">';
    else
    if(v1==wangD)//(v1==15||v1==16)&&v2)
      str='<font color="#FF0000">○</font>';
    else
    if(v1==xiaxD)//(v1==15||v1==16)&&v2)
      str='<img border="0" src="7000wnldat/xiax.jpg" width="12" height="12">';
    else;
  }
  return str;
}

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
burninghot
  4楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:1 积分:211 威望:0 精华:0 注册:2009/8/15 10:07:00
  发帖心情 Post By:2009/9/16 11:33:00

真的蛮好的..谢谢LZ

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
g2david
  5楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:4 积分:254 威望:0 精华:0 注册:2010/12/19 9:51:00
  发帖心情 Post By:2011/1/3 23:03:00

我將Javascript 改成 C#後, 發現跟你的Javascript有差別. 差五分鐘 請師兄指教.


2011年1月6日東8區 00:59:37 定1
2011年1月20日東8區 18:24:39 定2

你的原程式:
2010/1/6 0:54:36
2010/1/20 18:18:31

看不出那裡有問題, 請幫忙

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
g2david
  6楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:4 积分:254 威望:0 精华:0 注册:2010/12/19 9:51:00
  发帖心情 Post By:2011/1/3 23:16:00

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace luca
{
    class Program
    {
        double[] ykche = new double[] {
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};

        double[] kche = new double[] {
        -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};

        double[] jkche = new double[] {
        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};
        int[] jkche2 = new int[]{
        -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};


        string[] ifGr5a=new string[]{"周曆","周曆","秦曆","殷曆","殷曆","魯曆","周曆","夏曆"};

        double PI(){
            return Math.PI;
        }

        double sin(double x){
        return Math.Sin(x);
        }

        double cos(double x){
        return Math.Cos (x);
        }

        double abs(double x){
        return Math.Abs(x);
        }

        double floor(double x){
        return Math.Floor (x);
        }

        double round(double x){
        return Math.Round(x);
        }

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

        double rem(double x,double w)
        {
          return tail(x/w)*w;
        }

     
  double ifGr5(double y,double m,double d){  //公曆y年m月(1,2..12,下同)d日
  var v=(y-1)*365+floor((y-1)/4)+D0(y,m,d)-2;
  if(y>1582)
    v+=-floor((y-1)/100)+floor((y-1)/400)+2;
  var jd=(v+1721425);//等效儒略日
  var opt = 0;
    if(jd>=-10000)opt=7;//夏曆
    if(jd>=1137055)opt=3;//-1599,2,1殷曆
    if(jd>=1339370)opt=0;//-1046,12,30周曆
    if(jd>=1457728)opt=5;//-721,1,16魯曆
    if(jd>=1547530)opt=0;//-476,11,27周曆
    if(jd>=1628238)opt=2;//-255,11,15秦曆
    if(jd>=1683519)opt=7;//-103,3,23夏曆
    if(jd>=1724360)opt=4;//9,1,15殷曆
    if(jd>=1729764)opt=7;//23,11,2夏曆
    if(jd>=1807725)opt=4;//237,4,13殷曆-魏
    if(jd>=1808729)opt=7;//240,1,12夏曆
    if(jd>=1973067)opt=1;//689,12,18周曆-武周
    if(jd>=1977082)opt=7;//700,12,15夏曆
    if(jd>=1999349)opt=6;//761,12,2周曆-唐肅宗
    if(jd>=1999497)opt=7;//762,4,29夏曆
    return opt;
  }
//判斷Gregorian曆還是Julian曆 
  double ifGr(double y, double m, double d, double opt)
  {  //陽曆y年m月(1,2,..,12,下同)d日,opt=1,2,3分別表示標準日曆,Gregorge曆和Julian曆
  if(opt==1){
    if(y>1582||(y==1582&&m>10)||(y==1582&&m==10&&d>14))
      return(1);  //Gregorian
    else
      if(y==1582&&m==10&&d>=5&&d<=14)
        return(-1);  //空
      else
        return(0);  //Julian
  }
  if(opt==2)
    return(1);  //Gregorian
  if(opt==3)
    return(0);  //Julian

  return 0;
}



        double JD(double y, double m, double d, double h, double min, double sec, double zone)
        {
          var ifG=ifGr(y,m,d,1);
          var jt=(h+(min+sec/60)/60)/24-0.5-zone/24;
          //r d=(ifG)?(erD(y,m,d)+1721425+jt):(erD(y,m,d)+1721425+jt);//儒略日
          var jd= (erD(y, m, d) + 1721425 + jt);
          return jd;
        }

        double D0(double y, double m, double d)
        {
          var ifG=ifGr(y,m,d,1);
          var monL=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
          if(ifG!=0)
              if((y%100!=0&&y%4==0)||(y%400==0))
                monL[2]+=1;           
          else
              if(y%4==0)
                  monL[2]+=1;         
          double 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 = 0;  //infinity
          }
          return v;
        }

        double antiD0(double y, double x)
        {
          var m=1;
          for(var j=1;j<=12;j++){
              var mL = D0(y, m + 1, 1) - D0(y, m, 1); if (y == 1582 && m == 10) mL = 31;
            if(x<=mL||j==12){
              m=j;
              break;
            }
            else
              x-=mL;
          }
          return 100*m+x;
        }

        double D(double 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;
        }

        double erD(double y, double m, double 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;
        }

        double S(double y, double n, int 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="var"  yk2="yk-j;
"          var="var"  jud="y*(yk2-6.4e-14*(y-100)*(y-100)-3.047e-8*(y-100))+15.218427*n+1721050.71301;//?謹?
"          var="var"  tht="3e-4*y-0.372781384-0.2617913325*n;//褒僅
"          var="var"  yrd="(1.945*sin(tht)-0.01206*sin(2*tht))*(1.048994-2.583e-5*y);//爛船?歙
"          var="var"  shuod="-18e-4*sin(2.313908653*y-0.439822951-3.0443*n);//侇船?歙

"          double="double"  vs;
              if="if"  (pd!=0)
                  vs="(juD+yrD+shuoD-erD(y,1,0)-1721425);
"            else="else"  vs="(juD-erD(y,1,0)-1721425);
"          return="return"  vs;
        }

        double="double"  S2(double y, double="double"  m, double="double"  d, int="int"  n)
        {  ///-221善1645妢???,?滲殿隙妢????腔D0硉
            var="var"  jejd="round(JD(y,m,d,20,0,0,8)*1000)/1000;"  var="var"  ykd="(round(JD(y,1,1,20,0,0,8)*1000)/1000)-1;
"            var="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=0;
              return vj;
            }
        double S2(double y, double m, double d, double 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=0;
  return vj;
}
public string jqi(double y,double m,double d, double 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);  ///節氣交接公暦月。
  var 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);
  var sDate0=sD0%100;
  var 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);
  var sDate1=sD1%100;
  var 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);
  var sDate2 = sD2 % 100; if (y == 1582 && m == 10) sDate2 = sDate2 + 10;
  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);
  var 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(qk00D0(y,m,mL)) sN00=0;
  if(qk0D0(y,m,mL)) sN0=0;
  if(qk1D0(y,m,mL)) sN1=0;
  if(qk2D0(y,m,mL)) sN2=0;
  if(qk3D0(y,m,mL)) sN3=0;//
  sT00="%公暦"+yr2+sM00+"月"+sDate00+"日"+"東8區"+(tail(sDt00))+" 定"+(sN00)+"
";if(sN00==0) sT00="";
  sT0="*公暦"+yr2+sM0+"月"+sDate0+"日"+"東8區"+(tail(sDt0))+" 定"+(sN0)+"
";if(sN0==0) sT0="";
  sT1="&公暦"+yr2+sM1+"月"+sDate1+"日"+"東8區"+(tail(sDt1))+" 定"+(sN1)+"
";if(sN1==0) sT1="";
  sT2="$公暦"+yr2+sM2+"月"+sDate2+"日"+"東8區"+(tail(sDt2))+" 定"+(sN2);if(sN2==0)sT2="";
  sT3="
"+"#公暦"+yr2+sM3+"月"+sDate3+"日"+"東8區"+(tail(sDt3))+" 定"+(sN3);if(sN3==0)sT3="";
  var qSt5="";if(a==1)qSt5="定";if(a==2)qSt5=""+"◆";
  if(jqk==qk00)if(sT00==""){sDsStr1="|";} else{sDsStr1=qSt5+(sN00.ToString ())+":東8區"+(tail(sDt00).ToString ());}
  if(jqk==qk0)if(sT0==""){sDsStr1="|";}else{sDsStr1=qSt5+(sN0.ToString ())+":東8區"+(tail(sDt0).ToString ());}
  if(jqk==qk1)if(sN1==0){sDsStr1="|";}else{sDsStr1=qSt5+(sN1.ToString ())+":東8區"+(tail(sDt1).ToString ());}
  if(jqk==qk2)if(sN2==0){sDsStr1="|";}else{ sDsStr1=qSt5+(sN2.ToString ())+":東8區"+(tail(sDt2).ToString ());} ///
  if(jqk==qk3)if(sT3==""){sDsStr1="|";}else{sDsStr1=qSt5+(sN3.ToString ())+":東8區"+(tail(sDt3).ToString ());}
 
  if(jqk==qk00)if(sT00==""){qSt="";}else{qSt=qSt5+(sN00.ToString ());}
  if(jqk==qk0)if(sT0==""){qSt="";}else{qSt=qSt5+(sN0.ToString ());}
  if(jqk==qk1)if(sT1==""){qSt="";}else{qSt=qSt5+(sN1.ToString ());}
  if(jqk==qk2)if(sT2==""){qSt="";}else{ qSt=qSt5+(sN2.ToString ());}
  if (jqk == qk3) if (sT3 == "") { qSt = ""; } else { qSt = qSt5 + (sN3.ToString()); }
  if(a==1){return sDsStr1;}else{
  if(a==2){return qSt;}else{
  if(a==3){return qSt;}else{
  return sT00+sT0+sT1+sT2+sT3;}}}

 
  }/////節氣計算結束

        static void Main(string[] args)
        {
            Program a = new Program();
            Console.WriteLine(a.jqi(2010, 1, 1, 0));
            Console.ReadKey();
        }
    }
}

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
chwc
  7楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:603 积分:5315 威望:0 精华:4 注册:2008/4/21 19:06:00
  发帖心情 Post By:2011/1/8 22:07:00

    因为现在我的程序整合了许剑伟的高精历算函数。
    我在2010年8月本来想直接采用许剑伟历算代码、但是因为我的软件有黄历择吉等内容、我的编程手法和他又不同,直接用他的原代码我的软件打开速度实在太慢,所以只好整合许剑伟的高精历算函数。过几天我会重发整合高精历算函数后的节气计算代码。

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
CPU
  8楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:25 积分:407 威望:0 精华:0 注册:2005/11/26 4:45:00
  发帖心情 Post By:2011/3/10 2:45:00

过几天我会重发整合高精历算函数后的节气计算代码。

希望能早日领教!!!

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

返回版面帖子列表

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








签名