eph.js文件在寿星万年历中
<script language=javascript src=eph.js></script>
<script language=javascript>
//===============气朔时刻精算=======================
function qi_accurate(W) { var t=XL.S_aLon_t(W)*36525; return t - JD.deltatT2(t) + 8/24; } //精气
function suo_accurate(W) { var t=XL.MS_aLon_t(W)*36525; return t - JD.deltatT2(t) + 8/24; } //精朔
function getQS1(jd,qs){
if(qs=='气') return qi_accurate ( Math.floor((jd+293)/365.2422*24) * Math.PI/12 );
else return suo_accurate ( Math.floor((jd+8)/29.5306) * Math.PI*2 );
}
Lunar={
Gan:new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸"),
Zhi:new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"),
ShX:new Array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"),
XiZ:new Array('摩羯','水瓶','双鱼','白羊','金牛','双子','巨蟹','狮子','处女','天秤','天蝎','射手'),
yxmc:new Array("朔","上弦","望","下弦"), //月相名称表
jqmc:new Array('冬至','小寒','大寒','立春','雨水','惊蛰','春分','清明','谷雨','立夏','小满','芒种','夏至','小暑','大暑','立秋','处暑','白露','秋分','寒露','霜降','立冬','小雪','大雪'),
ymc:new Array('十一','十二','正','二','三','四','五','六','七','八','九','十'), //月名称,建寅
rmc:new Array('初一','初二','初三','初四','初五','初六','初七','初八','初九','初十','十一','十二','十三','十四','十五','十六','十七','十八','十九','二十','廿一','廿二','廿三','廿四','廿五','廿六','廿七','廿八','廿九','三十'),
Weeks:new Array('日','一','二','三','四','五','六','七','八','九','十'),
//在调用calc()或calc2()后得到以下数据
leap:0, //闰月位置
ym:new Array(), //各月名称
ZQ:new Array(), //中气表,其中.liqiu是节气立秋的儒略日,计算三伏时用到
HS:new Array(), //合朔表
dx:new Array(), //各月大小
nu:new Array(), //闰月情况
lun:new Array(),//月历数组,在调用calc2()之后得到
calc:function(jd){ //农历排月序计算,可定出农历
var A=this.ZQ, B=this.HS; //中气表,日月合朔表(整日)
var i, k, W, w;
//该年的中气
W = int2( (jd-355+183)/365.2422 )*365.2422+355; //355是2000.12冬至,得到较靠近jd的冬至估计值
if(getQS1(W,'气')>jd) W-=365.2422;
for(i=0;i<25;i++) A[i]=getQS1(W+15.2184*i,'气'); //25个节气时刻(北京时间),从冬至开始到下一个冬至以后
//今年"首朔"的日月黄经差w
w = getQS1(A[0],'朔'); //求较靠近冬至的朔日
if(w>A[0]) w -= 29.53;
//该年所有朔,包含14个月的始末
for(i=0;i<15;i++) B[i]=getQS1(w+29.5306*i,'朔');
//确定闰月
for(i=0;i<14;i++) this.ym[i]=i; //月序初始化
this.leap = 0;
if( B[13] <= A[24] ){ //第13月的月末没有超过冬至(不含冬至),说明今年含有13个月
for(i=1; B[i+1]>A[2*i] && i<13; i++); //在13个月中找第1个没有中气的月份
this.leap = i;
for(;i<14;i++) this.ym[i]--;
}
//月大小及名称转换
for(i=0;i<14;i++){
this.dx[i] = int2(this.HS[i+1]+0.5)-int2(this.HS[i]+0.5);
var Dm = int2(this.HS[i]+0.5)+J2000, v2=this.ym[i]; //Dm初一的儒略日,v2为月建序号
var mc = this.ymc[v2%12]; //默认月建对应的月名称:建子十一,建丑十二,建寅为正……
if(Dm>=1807724 && Dm<=1808699){ //237.4.12至239.12.13月建变为建子为十二,其它顺推
mc = this.ymc[(v2+1)%12];
if(Dm==1808699) mc='拾贰'; //239.12.13为十二月,为避免两个连续十二月,此处改名
}
else if( Dm>=1999349 && Dm<=1999467 ){ //761.12.2 至762.3.30 建子为正月,其它顺推
mc = this.ymc[(v2+2)%12];
}
else if( Dm>=1973067 && Dm<=1977112 ){ //689.12.18至701.1.14建子为正月,建寅为一月,其它不变
if(v2==0||v2==12) mc="正";
if(v2==2) mc='一';
}
this.ym[i]=mc;
if((i==this.leap) && i) this.nu[i]='闰'; else this.nu[i]='';
}
}
}
function nianLiHTML(y){ //html年历生成
var i,j,s='', s1,s2,v;
Lunar.calc( int2((y-2000)*365.2422+180) );
for(i=0;i<14;i++){
if(Lunar.HS[i+1]>Lunar.ZQ[24]) break; //已包含下一年的冬至
s1 = Lunar.nu[i]; if(!s1) s1 = '·';
s1 += Lunar.ym[i]; if(s1.length<3) s1 += '月';
s1 += Lunar.dx[i]>29?'大':'小';
s1 += ' '+JD.setFromJD_str(Lunar.HS[i]+J2000).substr(6,14);
for(j=0;j<24;j++){
if(Lunar.ZQ[j]<Lunar.HS[i] || Lunar.ZQ[j]>=Lunar.HS[i+1]) continue;
s1 += ' '+Lunar.jqmc[j]+JD.setFromJD_str(Lunar.ZQ[j]+J2000).substr(6,14);
}
s += s1 + '<br>';
}
return y+'年<br>'+s;
}
function test(){
var y=Cy.value-0,n=Cn.value-0,s1='',s2='';
var i,j;
for(i=0;i<n;i++){
s1+=nianLiHTML(i+y);
s2+=nianLiHTML(i+y+19);
}
out1.innerHTML=s1;
out2.innerHTML=s2;
}
</script>
<input type=text value=2001 id=Cy>
<input type=text value=20 id=Cn>
<input type=button value="确定" onclick="test()">
<table style='font-size:12px'>
<tr><td id=out1></td><td id=out2></td></tr>
</table>