Super wang
2024-05-16 18:48:28
最佳回答
如果你懂得网页脚本,以下地址中的脚本可以计算农历.可以下载下来看看它的源代码.部分内容://====================================== 返回农历 y年的总天数function lyeardays(y) {var i, sum = 348;for(i=0x8000; i>0x8; i>>=1) sum += (lunar**[y-1900] & i)? 1: 0;return(sum+leapdays(y));}//====================================== 返回农历 y年闰月的天数function leapdays(y) {if(leapmonth(y)) return((lunar**[y-1900] & 0x10000)? 30: 29);else return(0);}//====================================== 返回农历 y年闰哪个月 1-12 , 没闰返回 0function leapmonth(y) {return(lunar**[y-1900] & 0xf);}//====================================== 返回农历 y年m月的总天数function monthdays(y,m) {return( (lunar**[y-1900] & (0x10000>>m))? 30: 29 );}//====================================== 算出农历, 传入日期控件, 返回农历日期控件// 该控件属性有 .year .month .day .**leapfunction lunar(objdate) {var i, leap=0, temp=0;var offset = (date.utc(objdate.getfullyear(),objdate.getmonth(),objdate.getdate()) - date.utc(1900,0,31))/86400000;for(i=1900; i<2050 && offset>0; i++) { temp=lyeardays(i); offset-=temp; }if(offset<0) { offset+=temp; i--; }th**.year = i;leap = leapmonth(i); //闰哪个月th**.**leap = false;for(i=1; i<13 && offset>0; i++) {//闰月if(leap>0 && i==(leap+1) && th**.**leap==false){ --i; th**.**leap = true; temp = leapdays(th**.year); }else{ temp = monthdays(th**.year, i); }//解除闰月if(th**.**leap==true && i==(leap+1)) th**.**leap = false;offset -= temp;}if(offset==0 && leap>0 && i==leap+1)if(th**.**leap){ th**.**leap = false; }else{ th**.**leap = true; --i; }if(offset<0){ offset += temp; --i; }th**.month = i;th**.day = offset + 1;}//==============================返回公历 y年某m+1月的天数function solardays(y,m) {if(m==1)return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28);elsereturn(solarmonth[m]);}//============================== 传入 offset 返回干支, 0=甲子function cyclical(num) {return(gan[num%10]+zhi[num%12]);}//============================== 阴历属性function calelement(syear,smonth,sday,week,lyear,lmonth,lday,**leap,cyear,cmonth,cday) {th**.**today = false;//瓣句th**.syear = syear; //公元年4位数字th**.smonth = smonth; //公元月数字th**.sday = sday; //公元日数字th**.week = week; //星期, 1个中文//农历th**.lyear = lyear; //公元年4位数字th**.lmonth = lmonth; //农历月数字th**.lday = lday; //农历日数字th**.**leap = **leap; //是否为农历闰月?//八字th**.cyear = cyear; //年柱, 2个中文th**.cmonth = cmonth; //月柱, 2个中文th**.cday = cday; //日柱, 2个中文th**.color = '';th**.lunarfestival = ''; //农历节日th**.solarfestival = ''; //公历节日th**.solarterms = ''; //节气}//===== 某年的第n个节气为几日(从0小寒起算)function sterm(y,n) {var offdate = new date( ( 31556925974.7*(y-1900) + sterm**[n]*60000 ) + date.utc(1900,0,6,2,5) );return(offdate.getutcdate());}//============================== 返回阴历控件 (y年,m+1月)/*功能说明: 返回整个月的日期资料控件使用方式: obj = new calendar(年,零起算月);obj.length 返回当月最大日obj.firstweek 返回当月一日星期由 obj[日期].属性名称 即可取得各项值obj[日期].**today 返回是否为今日 true 或 false其他 obj[日期] 属性参见 calelement() 中的注解*/function calendar(y,m) {var sdobj, ldobj, ly, lm, ld=1, ll, lx=0, tmp1, tmp2, tmp3;var cy, cm, cd; //年柱,月柱,日柱var ldpos = new array(3);var n = 0;var firstlm = 0;sdobj = new date(y,m,1,0,0,0,0); //当月一日日期th**.length = solardays(y,m); //公历当月天数th**.firstweek = sdobj.getday(); //公历当月1日星期几////////年柱 1900年立春后为庚子年(60进制36)if(m<2) cy=cyclical(y-1900+36-1);else cy=cyclical(y-1900+36);var term2=sterm(y,2); //立春日期////////月柱 1900年1月小寒以前为 丙子月(60进制12)var firstnode = sterm(y,m*2) //返回当月「节」为几日开始cm = cyclical((y-1900)*12+m+12);//当月一日与 1900/1/1 相差天数//1900/1/1与 1970/1/1 相差25567日, 1900/1/1 日柱为甲戌日(60进制10)var daycyclical = date.utc(y,m,1,0,0,0,0)/86400000+25567+10;for(var i=0;i<th**.length;i++) {if(ld>lx) {sdobj = new date(y,m,i+1); //当月一日日期ldobj = new lunar(sdobj); //农历ly = ldobj.year; //农历年lm = ldobj.month; //农历月ld = ldobj.day; //农历日ll = ldobj.**leap; //农历是否闰月lx = ll? leapdays(ly): monthdays(ly,lm); //农历当月最后一天if(n==0) firstlm = lm;ldpos[n++] = i-ld+1;}//依节气调整二月分的年柱, 以立春为界if(m==1 && (i+1)==term2) cy=cyclical(y-1900+36);//依节气月柱, 以「节」为界if((i+1)==firstnode) cm = cyclical((y-1900)*12+m+13);//日柱cd = cyclical(daycyclical+i);//syear,smonth,sday,week,//lyear,lmonth,lday,**leap,//cyear,cmonth,cdayth**[i] = new calelement(y, m+1, i+1, nstr1[(i+th**.firstweek)%7],ly, lm, ld++, ll,cy ,cm, cd );} 20210311