var JD={ //日期元件
JD:function(y,m,d){ //公历转儒略日
var n=0, G=0;
if(y*372+m*31+int2(d)>=588829) G=1; //判断是否为格里高利历日1582*372+10*31+15
if(m<=2) m+=12, y--;
if(G) n=int2(y/100), n=2-n+int2(n/4); //加百年闰
return int2(365.25*(y+4716)) + int2(30.6001*(m+1))+d+n - 1524.5;
},
DD:function(jd){ //儒略日数转公历
var r=new Object();
var D=int2(jd+0.5), F=jd+0.5-D, c; //取得日数的整数部份A及小数部分F
if(D>=2299161) c=int2((D-1867216.25)/36524.25),D+=1+c-int2(c/4);
D += 1524; r.Y = int2((D-122.1)/365.25);//年数
D -= int2(365.25*r.Y); r.M = int2(D/30.601); //月数
D -= int2(30.601*r.M); r.D = D; //日数
if(r.M>13) r.M -= 13, r.Y -= 4715;
else r.M -= 1, r.Y -= 4716;
//日的小数转为时分秒
F*=24; r.h=int2(F); F-=r.h;
F*=60; r.m=int2(F); F-=r.m;
F*=60; r.s=F;
return r;
},
DD2str:function(r){ //日期转为串
var Y=" "+r.Y, M="0"+r.M, D="0"+r.D;
var h=r.h, m=r.m, s=int2(r.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;
},
JD2str:function(jd){ //JD转为串
var r=this.DD( jd );
return this.DD2str( r );
},
Y:2000, M:1, D:1, h:12, m:0, s:0,
toJD:function(){ return this.JD( this.Y, this.M, this.D+((this.s/60+this.m)/60+this.h)/24 ); }, //公历转儒略日
setFromJD:function(jd){ var r=this.DD(jd); this.Y=r.Y, this.M=r.M, this.D=r.D, this.m=r.m, this.h=r.h, this.s=r.s; }, //儒略日数转公历
timeStr:function(jd){ //提取jd中的时间(去除日期)
var h,m,s;
jd+=0.5; jd = (jd - int2(jd));
s=int2(jd*86400+0.5);
h=int2(s/3600); s-=h*3600;
m=int2(s/60); s-=m*60;
h="0"+h; m="0"+m; s="0"+s;
return h.substr(h.length-2,2)+':'+m.substr(m.length-2,2)+':'+s.substr(s.length-2,2);
},
}
用同一个儒略日参数来测试 JD2str() 与 timeStr () 发现,两个结果的秒位不相同,相差一秒,不知是属于正的常的误差,还是必须纠正的错误。