你一直说2006的节气有错,你书上的节气时刻到底是多少,怎么会和你推算的相差了10个小时。
2006年的数据肯定是天脑计算的,如果出错,也不至于只有这3个节气发生如此粗大的误差,通常会全部出错。
以下是我昨晚特地为你编写的一段节气计算程序,在公元1000年——公元3000年,精度控制在2分钟以内,程序很短,你可以调试一下。
这是一个节气计算程序,理论上的最大可能误为120秒,平均误差为15秒。(这里所述的误差不含delteT外推的误差)<br>
功能:帮助小李飞刀推算节气时间<br>
太阳坐标计算基于VSOP87半解析理论,程序中已考虑了光行差修正、章动修正、与DE405拟合平黄经(包括岁差改正)<br>
这个程序可以推算最近几千年的节气,xjw01,2008年8月7月晚上制作<br>
年份 <input type=text id=year value=2006>
个数 <input type=text id=testN value=24>
<input type=button value="节气计算" onclick=dingQi()>
<div id=out></div>
<script language=javascript>
function Sun_aLon_t(W){ //已知黄经求时间,最大误差120秒,平均15秒
var t,L,v= 628.3319653318;
t = ( W - 4.895062166 )/v; //第一次估算,误差2天以内
t -= ( 53*t*t + 334116*Math.cos( 4.67+628.307585*t) + 2061*Math.cos( 2.678+628.3076*t)*t )/v/10000000; //第二次估算,误差2小时以内
var t2=t*t,t3=t2*t,t4=t3*t;
L = 48950621.66 + 6283319653.318*t + 52.9674*t2 + 0.00432*t3 - 0.001124*t4 //平黄经
+334166 * Math.cos( 4.669257+ 628.307585*t) //地球椭圆级数展开
+3489 * Math.cos( 4.6261 + 1256.61517*t ) //地球椭圆级数展开
+ 350 * Math.cos( 2.744 + 575.3385*t) //木星摄动
+ 342 * Math.cos( 2.829 + 0.3523*t) //长期摄动(火星木星)
+ 314 * Math.cos( 3.628 + 7771.3771*t) //月球求对地球的摄动
+ 268 * Math.cos( 4.418 + 786.0419*t)
+ 234 * Math.cos( 6.135 + 393.021*t )
+ 132 * Math.cos( 0.742 + 1150.677*t )
+ 127 * Math.cos( 2.037 + 52.9691*t)
+ 120 * Math.cos( 1.11 + 157.7344*t)
+ 99 * Math.cos( 5.23 + 588.493*t )
+ 90 * Math.cos( 2.05 + 2.63*t )
+ 86 * Math.cos( 3.51 + 39.815*t )
+ 78 * Math.cos( 1.18 + 522.369*t )
+ 75 * Math.cos( 2.53 + 550.755*t )
+ 51 * Math.cos( 4.58 + 1884.923*t )
+ 49 * Math.cos( 4.21 + 77.552*t )
+ 36 * Math.cos( 2.92 + 0.07*t )
+ 32 * Math.cos( 5.85 + 1179.063*t )
+ 28 * Math.cos( 1.9 + 79.63*t )
+ 27 * Math.cos( 0.31 + 1097.71*t )
+2060.6 * Math.cos( 2.67823 + 628.307585*t ) * t //一次泊松项
+43.0 * Math.cos( 2.635 + 1256.6152*t ) * t //一次泊松项
+8.72 * Math.cos( 1.072 + 628.3076*t ) * t2 //二次柏松项
- 994 - 834*Math.sin(2.1824-33.75705*t) - 64*Math.sin(3.5069+1256.66393*t); //光行差与章动修正
return t - (L/10000000 -W )/(628.332 +21 *Math.sin(1.527+628.307585*t));
}
J2000 = 2451545.0;
function int2(v){ return Math.floor(v); } //取整数部分
var Date2={ //日期时间转换物件
Y:2000, M:1, D:1, h:12, m:0, s:0,
dts:new Array( // TD - UT1 计算表
-4000,108371.7,-13036.80,392.000, 0.0000, -500, 17201.0, -627.82, 16.170,-0.3413,
-150, 12200.6, -346.41, 5.403,-0.1593, 150, 9113.8, -328.13, -1.647, 0.0377,
500, 5707.5, -391.41, 0.915, 0.3145, 900, 2203.4, -283.45, 13.034,-0.1778,
1300, 490.1, -57.35, 2.085,-0.0072, 1600, 120.0, -9.81, -1.532, 0.1403,
1700, 10.2, -0.91, 0.510,-0.0370, 1800, 13.4, -0.72, 0.202,-0.0193,
1830, 7.8, -1.81, 0.416,-0.0247, 1860, 8.3, -0.13, -0.406, 0.0292,
1880, -5.4, 0.32, -0.183, 0.0173, 1900, -2.3, 2.06, 0.169,-0.0135,
1920, 21.2, 1.69, -0.304, 0.0167, 1940, 24.2, 1.22, -0.064, 0.0031,
1960, 33.2, 0.51, 0.231,-0.0109, 1980, 51.0, 1.29, -0.026, 0.0032,
2000, 63.87, 0.1, 0, 0, 2005),
deltatExt:function(y,jsd){ var dy=(y-1820)/100; return -20+jsd*dy*dy; }, //二次曲线外推
deltatT:function(y){ //计算世界时与原子时之差,传入年
if(y>=2005){
//sd是2005年之后几年(一值到y1年)的速度估计。
//sjd是y1年之后的加速度估计。瑞士星历表jsd=31,NASA网站jsd=32,skmap的jsd=29
var y1=2014, sd=0.4, jsd=31;
if(y<=y1) return 64.7 + (y-2005) *sd; //直线外推
var v = this.deltatExt(y,jsd); //二次曲线外推
var dv= this.deltatExt(y1,jsd) - ( 64.7+(y1-2005)*sd ); //y1年的二次外推与直线外推的差
if(y<y1+100 ) v -= dv*(y1+100-y)/100;
return v;
}
var i,d=this.dts;
for(i=0;i<d.length;i+=5) if(y<d[i+5]) break;
var t1=(y-d[i])/(d[i+5]-d[i])*10, t2=t1*t1, t3=t2*t1;
return d[i+1] +d[i+2]*t1 +d[i+3]*t2 +d[i+4]*t3;
},
deltatT2:function(t){ //传入儒略日(J2000起算),计算TD-UT(单位:日)
return this.deltatT(t/365.2425+2000)/86400.0;
},
toJD:function(){ //公历转儒略日,UTC=1表示原日期是UTC
var y=this.Y, m=this.M, n=0; //取出年月
if(m<=2) m+=12,y--;
if(this.Y*372+this.M*31+this.D>=588829)//判断是否为格里高利历日1582*372+10*31+15
n =int2(y/100), n =2-n+int2(n/4);//加百年闰
n +=int2(365.25*(y+4716)+0.01); //加上年引起的偏移日数
n +=int2(30.6*(m+1))+this.D; //加上月引起的偏移日数及日偏移数
n +=((this.s/60+this.m)/60+this.h)/24 - 1524.5;
return n;
},
setFromJD:function(jd){ //儒略日数转公历,UTC=1表示目标公历是UTC
jd+=0.5;
var A=int2(jd), F=jd-A, D; //取得日数的整数部份A及小数部分F
if(A>=2299161) D=int2((A-1867216.25)/36524.25),A+=1+D-int2(D/4); //格里历与儒略历之间的切换
A +=1524; //向前移4年零2个月
this.Y =int2((A-122.1)/365.25);//年
D =A-int2(365.25*this.Y); //去除整年日数后余下日数
this.M =int2(D/30.6001); //月数
this.D =D-int2(this.M*30.6001);//去除整月日数后余下日数
this.Y-=4716; this.M--;
if(this.M>12) this.M-=12;
if(this.M<=2) this.Y++;
//日的小数转为时分秒
F*=24; this.h=int2(F); F-=this.h;
F*=60; this.m=int2(F); F-=this.m;
F*=60; this.s=F;
},
toStr:function(){ //日期转为标准格式的字符串
var Y=" "+this.Y,M="0"+this.M, D="0"+this.D;
var h=this.h,m=this.m,s=int2(this.s+.5);
if(s>=60) s-=60,m++;
if(m>=60) m-=60,h++;
h="0"+h; m="0"+m; s="0"+s;
Y=Y.substr(Y.length-5,5); M=M.substr(M.length-2,2); D=D.substr(D.length-2,2);
h=h.substr(h.length-2,2); m=m.substr(m.length-2,2); s=s.substr(s.length-2,2);
return Y+"-"+M+"-"+D+" "+h+":"+m+":"+s;
}
}
var JQname =new Array(
'春分','清明','谷雨','立夏','小满','芒种',
'夏至','小暑','大暑','立秋','处暑','白露',
'秋分','寒露','霜降','立冬','小雪','大雪',
'冬至','小寒','大寒','立春','雨水','惊蛰' );
function dingQi(){ //节气计算
var i,T,maxT=0,s='';
var y=year.value-2000+1;
var N=testN.value-0;
for(i=0;i<N;i++){
W = (y+i/24)*2*Math.PI;
T = Sun_aLon_t( W )*36525; //得到黄经为W是的时间
T -= Date2.deltatT2(T); //转为格林尼治时间
T += 8/24; //转为北京时间(东8区)
Date2.setFromJD(T+J2000);
s+=JQname[i%24] + Date2.toStr()+'<br>';
}
out.innerHTML = s;
}
</script>