📄 xx1.htm
字号:
<script language=javascript>
function int2(v){ return Math.floor(v);}
var JD={ //日期元件
Y:2000, M:1, D:1, h:12, m:0, s:0,
toJD:function(){ //公历转儒略日
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){ //儒略日数转公历
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 gan=Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
gan['甲']=0;gan['乙']=1;gan['丙']=2;gan['丁']=3;gan['戊']=4;
gan['己']=5;gan['庚']=6;gan['辛']=7;gan['壬']=8;gan['癸']=9;
function getsjb(lun,nd,ra,rb){//取数据表
var i,j,k,p,v,v2,rn,Y;
nd=nd.split(" "); for(i=0;i<4;i++) nd[i]-=0;
//提取朔日和节气
JD.h=12;JD.m=JD.s=0;
ra.length=rb.length=0;
var n1=-1,n2=-1;
var qa=new Array(), qb=new Array(), ye=new Array();
for(i=0;i<lun.length;i++){
v=lun[i]; if(!v) continue;
if(v.substr(0,1)=="-") {
Y=v-0, rn=1;
continue;
}
if(Y==nd[0] && rn==nd[1]) n1=qa.length;
if(Y==nd[2] && rn==nd[3]) n2=qa.length;
JD.Y = Y;
JD.M = v.substr(0,2)-0;
JD.D = v.substr(2,2)-0;
if(rn<6&&JD.M>8) JD.Y--;
if(rn>8&&JD.M<5) JD.Y++;
qa[qa.length]=JD.toJD(); //初一
if(v.length>5) qb[qb.length] = v.substr(5,5)-0; //气总表
if(rn==1) ye[ye.length]=qa.length-1; //年首的月积数
rn++;
}
if(n1==-1||n2==-1) return 'err';
ra.ye=ye;
//取朔
for(i=n1;i<=n2;i++) ra[ra.length]=qa[i];
//取气
var b0=qa[0]+9,k0=365.25/8;
for(i=n1,k=0;i<=n2;i++){
v = int2( (qa[i]-b0)/k0+0.5 );
if(v>=qb.length) { alert('气数有误'); break; } //得到最靠近朔的气序号
v2 = qa[i]+qb[v]-1;
if(v2-(b0+v*k0)>10){
v++;
if(v>=qb.length) continue;
v2 = qa[i]+qb[v]-1;
if((b0+v*k0)-v2>10) continue;
}
rb[k++]=v2;
}
ra.jd=ra[0]-0.5;
for(i=1;i<ra.length;i++) ra[i]-=ra[0];
ra[0]=0;
rb.jd=rb[0]-0.5;
for(i=1;i<rb.length;i++) rb[i]-=rb[0];
rb[0]=0;
}
function nihe(r,k){//拟合计算
var b=0;
//var k=365.2422/8; if(r[1]-r[0]<33) k=29.5306; //斜率
var i,j,kk,v;
var k1=k-1,k2=k+1;
for(kk=0;kk<12;kk++){ //查找次数
var bm=-1000,bM=1000,bmi=-1;
for(i=0;i<r.length;i++){
v=r[i]-(k*i+b); //直线至少要上移的量
if(v>bm) bm=v,bmi=i;
if(v<bM) bM=v;
}
var h=(bM+1-bm)/2;
if(h>-1e-7){ b+=bm+h; r.gk = k; r.gb = b; r.gh = h; return "ok"; }
for(i=0;i<r.length;i++){
if(i==bmi) continue;
v=( r[i]+1 - r[bmi] ) / (i-bmi);
if(i<bmi && v>k1) k1=v;
if(i>bmi && v<k2) k2=v;
if(k1>k2) return "无解";
}
k=(k1+k2)/2;
b=r[bmi]-k*bmi;
}
return "查找"+kk+"次未找到解";
}
function chec(){
var i, nd=tin.innerText, ta=nlb.innerText, s='',S='',c2;
var ra=new Array(), rb=new Array();
nd=nd.split('\r\n');
ta=ta.split('\r\n');
for(i=0;i<nd.length;i++){
if(!nd[i]) continue;
if(getsjb(ta,nd[i],ra,rb)=='err') alert("表提取错误");
c2=nihe(rb,365.2422/8);
if(c2=='ok') s += (rb.gb+rb.jd).toFixed(6)+' ' + (rb.gk/3).toFixed(8) + ' h=' + rb.gh.toFixed(8) +'\r\n';
else s += c2+'\r\n';
c2=nihe(ra,29+499/940);
if(c2=='ok') S += (ra.gb+ra.jd).toFixed(6)+' ' + ra.gk.toFixed(8) + ' h=' + ra.gh.toFixed(8) +'\r\n';
else S += c2+'\r\n';
}
//年积数处理
c2=nihe(ra.ye,12.37);
if(c2=='ok'){
s+='年首积月 b='+ra.ye.gb.toFixed(6)+' k='+ra.ye.gk.toFixed(8)+' h='+ra.ye.gh.toFixed(6);
} else s+='年首月积无解';
out.innerText = '适用于-221年10月31日至-104年11月26日,朔还可外延2月\r\n平朔\r\n'+S+'平气\r\n'+s;
JD.setFromJD(ra.jd+0.5+ra[ra.length-1])
// alert( JD.toStr() );
}
/**
错误
-149 0321 改 0221 朔
-217 26 改27 气末个
-213 15 改 14 气第1
-209 8 改 7 气倒数第2
-174 第6气 减2天变为上月30
-166 第2气 23改24
-136 最后1气 19改20
本表为了拟合算法上的需要,更改了最后两气,实际那两气用太初历计算
**/
</script>
<a href=index.htm>返回</a>
<input type=button value='确定' onclick="chec()"><br>
<textarea id=tin cols=80 rows=20>
-220 1 -216 12
-215 1 -104 12
</textarea><br>
<textarea id=out cols=80 rows=20></textarea><br>
<textarea id=nlb style="display:none">
-220
1031 10
1129 27
1229 14
0127 29
0226 16
0326 03
0425 18
0524 05
0623 22
0723
0821
0920
1019
-219
1118 08
1217 24
0116 11
0214 27
0316 14
0414 01
0514 16
0612
0712
0810
0909
1008
-218
1107 03
1207 19
0105 05
0204 22
0305 09
0404 24
0503 11
0602 28
0701
0731
0829
0928
-217
1027 14
1126 01
1225 17
0124 03
0222 19
0324 05
0423 22
0522 09
0621 24
0720
0819
0917
1017
-216
1115 11
1215 28
0113 14
0212 01
0312 17
0411 03
0510 19
0609
0709
0807
0906
1005
-215
1104 06
1204 21
0102 08
0201 25
0302 11
0401 27
0430 14
0530 30
0628 16
0728
0826
0925
1025
-214
1123 03
1223 19
0121 06
0220 22
0321 08
0420 25
0519 12
0618 27
0717
0816
0914
1014
-213
1112 14
1212 01
0110 16
0209 03
0311 19
0409 06
0509 22
0607
0707
0805
0904
1003
-212
1102 08
1201 25
1231 12
0129 27
0228 14
0328 01
0427 16
0527 03
0625 20
0725
0823
0922
1021
-211
1120 06
1219 22
0118 09
0216 25
0318 12
0416 28
0516 14
0614
0714
0812
0911
1011
-210
1109 01
1209 17
0107 03
0206 20
0307 07
0406 22
0505 09
0604 26
0703
0802
0831
0930
-209
1029 12
1128 28
1227 15
0126 01
0225 17
0326 03
0425 20
0524 07
0623 22
0722
0821
0919
1019
-208
1117 09
1217 26
0115 12
0214 28
0314 15
0413 01
0513 17
0611
0711
0809
0908
1007
-207
1106 04
1205 20
0104 07
0202 23
0304 09
0402 26
0502 13
0531 28
0630 15
0729
0828
0927
1026
-206
1125 02
1224 17
0123 04
0221 21
0323 07
0421 23
0521 10
0619 26
0719
0817
0916
1015
-205
1114 12
1214 29
0112 15
0211 02
0312 17
0411 04
0510 21
0609
0708
0807
0905
1005
-204
1103 07
1203 23
0101 10
0131 26
0229 12
0330 29
0429 15
0528 02
0627 18
0726
0825
0923
1023
-203
1121 04
1221 21
0119 08
0218 23
0319 10
0418 27
0517 12
0616 29
0715
0814
0913
1012
-202
1111 16
1210 02
0109 18
0207 05
0309 21
0407 08
0507 24
0605
0705
0803
0902
1001
-201
1031 10
1130 26
1229 13
0128 29
0226 16
0328 02
0426 18
0526 05
0624 21
0724
0822
0921
1020
-200
1119 08
1218 24
0117 10
0215 26
0316 13
0415 29
0514 16
0613
0712
0811
0909
1009
-199
1107 03
1207 18
0105 05
0204 22
0305 08
0404 24
0503 11
0602 26
0702
0731
0830
0928
-198
1028 13
1126 30
1226 16
0124 03
0223 19
0324 05
0423 22
0522 09
0621 24
0720
0819
0917
1017
-197
1116 11
1215 27
0114 13
0212 30
0314 16
0412 03
0512 19
0610
0710
0808
0907
1006
-196
1105 05
1204 22
0103 09
0201 24
0302 11
0401 27
0430 13
0530 30
0628 17
0728
0826
0925
1024
-195
1123 03
1222 19
0121 06
0219 22
0321 08
0419 25
0519 11
0618 27
0717
0816
0914
1014
-194
1112 14
1212 30
0110 17
0209 04
0310 19
0409 06
0508 23
0607
0706
0805
0903
1003
-193
1102 08
1201 25
1231 12
0129 27
0228 14
0329 30
0428 17
0527 04
0626 19
0725
0824
0922
1022
-192
1120 06
1220 22
0119 08
0217 25
0318 12
0416 27
0516 14
0614
0714
0812
0911
1010
-191
1109 01
1208 17
0107 04
0205 20
0307 06
0405 22
0505 09
0604 25
0703
0802
0831
0930
-190
1029 12
1128 28
1227 14
0126 01
0224 18
0326 04
0424 20
0524 07
0622 22
0722
0820
0919
1019
-189
1117 09
1217 26
0115 12
0214 28
0315 14
0414 01
0513 18
0612
0711
0810
0908
1008
-188
1106 04
1206 20
0105 07
0203 22
0304 09
0402 26
0502 12
0531 28
0630 15
0729
0828
0926
1026
-187
1124 01
1224 18
0122 05
0221 20
0322 07
0421 23
0521 09
0619 26
0719
0817
0916
1015
-186
1114 13
1213 28
0112 15
0210 02
0312 18
0410 04
0510 21
0608
0708
0807
0905
1005
-185
1103 07
1203 23
0101 10
0131 26
0301 13
0331 28
0429 15
0529 02
0627 18
0727
0825
0924
1023
-184
1122 04
1222 21
0120 07
0219 23
0319 10
0418 26
0517 13
0616 29
0715
0814
0912
1012
-183
1110 15
1210 02
0108 19
0207 04
0308 21
0407 08
0507 23
0605
0705
0803
0902
1001
-182
1031 10
1129 27
1229 13
0127 29
0226 16
0327 02
0426 18
0525 05
0624 21
0724
0822
0921
1020
-181
1119 08
1218 24
0117 10
0215 27
0317 13
0415 29
0515 16
0613
0713
0811
0910
1009
-180
1108 02
1208 18
0106 05
0205 21
0305 08
0404 24
0503 10
0602 27
0701
0731
0829
0928
-179
1027 14
1126 29
1225 16
0124 03
0223 18
0324 05
0423 22
0522 08
0621 24
0720
0819
0917
1017
-178
1115 11
1215 27
0113 14
0212 01
0313 16
0412 03
0511 19
0610
0710
0808
0907
1006
-177
1105 05
1204 22
0103 09
0201 24
0303 11
0401 27
0501 14
0530 01
0629 16
0728
0827
0925
1025
-176
1124 03
1223 19
0122 05
0220 22
0321 09
0419 24
0519 11
0617 28
0717
0815
0914
1013
-175
1112 14
1211 30
0110 17
0209 03
0310 19
0409 06
0508 22
0607
0706
0805
0903
1003
-174
1101 09
1201 25
1230 11
0129 28
0227 15
0329 30
0427 17
0527 04
0626 19
0725
0824
0922
1022
-173
1120 06
1220 23
0118 09
0217 25
0318 11
0417 28
0516 14
0615 30
0714
0813
0912
1011
-172
1110 17
1209 04
0108 19
0206 06
0307 23
0405 09
0505 25
0603
0703
0801
0831
0929
-171
1029 12
1127 28
1227 14
0126 01
0224 17
0326 04
0424 20
0524 06
0622 23
0722
0820
0919
1018
-170
1117 10
1216 25
0115 12
0213 29
0315 14
0413 01
0513 18
0612
0711
0810
0908
1008
-169
1106 04
1206 20
0104 07
0203 23
0304 10
0403 25
0502 12
0601 28
0630 14
0730
0829
0927
1027
-168
1125 01
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -