带农历的脚本:
http://keleyi.com/keleyi/phtml/jstexiao/11.htm
1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 4 <TITLE>带农历的日历</TITLE> 5 <SCRIPT language="JavaScript"> 6 <!-- 7 var lunarInfo=new Array( 8 0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2, 9 0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977, 10 0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970, 11 0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950, 12 0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557, 13 0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0, 14 0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0, 15 0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6, 16 0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570, 17 0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0, 18 0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5, 19 0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930, 20 0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530, 21 0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45, 22 0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0) 23 24 var solarMonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31); 25 var Animals=new Array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"); 26 var solarTerm = new Array("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"); 27 var sTermInfo = new Array(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758); 28 var nStr1 = new Array('日','一','二','三','四','五','六','七','八','九','十'); 29 var nStr2 = new Array('初','十','廿','卅'); 30 //公历节日 31 var sFtv = new Array( 32 "0101 元旦", 33 "0214 情人节", 34 "0308 妇女节", 35 "0312 植树节", 36 "0315 消费者权益日", 37 "0401 愚人节", 38 "0501 劳动节", 39 "0504 青年节", 40 "0512 护士节", 41 "0601 儿童节", 42 "0701 建党节", 43 "0801 建军节", 44 "0910 教师节", 45 "0928 孔子诞辰", 46 "1001 国庆节", 47 "1006 老人节", 48 "1024 联合国日", 49 "1224 平安夜", 50 "1225 圣诞节") 51 //农历节日 52 var lFtv = new Array( 53 "0101 春节", 54 "0115 元宵节", 55 "0505 端午节", 56 "0707 七夕情人节", 57 "0715 中元节", 58 "0815 中秋节", 59 "0909 重阳节", 60 "1208 腊八节", 61 "1224 小年") 62 //返回农历y年的总天数 63 function lYearDays(y) { 64 var i, sum = 348; 65 for(i=0x8000; i>0x8; i>>=1)sum+=(lunarInfo[y-1900]&i)?1:0; 66 return(sum+leapDays(y)); 67 } 68 //返回农历y年闰月的天数 69 function leapDays(y) { 70 if(leapMonth(y)) return((lunarInfo[y-1900] & 0x10000)? 30: 29); 71 else return(0); 72 } 73 //判断y年的农历中那个月是闰月,不是闰月返回0 74 function leapMonth(y){ 75 return(lunarInfo[y-1900]&0xf); 76 } 77 //返回农历y年m月的总天数 78 function monthDays(y,m){ 79 return((lunarInfo[y-1900]&(0x10000>>m))?30:29); 80 } 81 //算出当前月第一天的农历日期和当前农历日期下一个月农历的第一天日期 82 function Dianaday(objDate) { 83 var i, leap=0, temp=0; 84 var baseDate = new Date(1900,0,31); 85 var offset = (objDate - baseDate)/86400000; 86 this.dayCyl = offset+40; 87 this.monCyl = 14; 88 for(i=1900; i<2050 && offset>0; i++) { 89 temp = lYearDays(i) 90 offset -= temp; 91 this.monCyl += 12; 92 } 93 if(offset<0) { 94 offset += temp; 95 i--; 96 this.monCyl -= 12; 97 } 98 this.year = i; 99 this.yearCyl=i-1864; 100 leap = leapMonth(i); //闰哪个月 101 this.isLeap = false; 102 for(i=1; i<13 && offset>0; i++) { 103 if(leap>0 && i==(leap+1) && this.isLeap==false){ //闰月 104 --i; this.isLeap = true; temp = leapDays(this.year);} 105 else{ 106 temp = monthDays(this.year, i);} 107 if(this.isLeap==true && i==(leap+1)) this.isLeap = false; //解除闰月 108 offset -= temp; 109 if(this.isLeap == false) this.monCyl++; 110 } 111 if(offset==0 && leap>0 && i==leap+1) 112 if(this.isLeap){ this.isLeap = false;} 113 else{this.isLeap=true;--i;--this.monCyl;} 114 if(offset<0){offset+=temp;--i;--this.monCyl;} 115 this.month=i; 116 this.day=offset+1; 117 } 118 //返回公历y年m+1月的天数 119 function solarDays(y,m){ 120 if(m==1) 121 return(((y%4==0)&&(y%100!=0)||(y%400==0))?29:28); 122 else 123 return(solarMonth[m]); 124 } 125 //记录公历和农历某天的日期 126 function calElement(sYear,sMonth,sDay,week,lYear,lMonth,lDay,isLeap) { 127 this.isToday = false; 128 //公历 129 this.sYear = sYear; 130 this.sMonth = sMonth; 131 this.sDay = sDay; 132 this.week = week; 133 //农历 134 this.lYear = lYear; 135 this.lMonth = lMonth; 136 this.lDay = lDay; 137 this.isLeap = isLeap; 138 //节日记录 139 this.lunarFestival = ''; //农历节日 140 this.solarFestival = ''; //公历节日 141 this.solarTerms = ''; //节气 142 } 143 //返回某年的第n个节气为几日(从0小寒起算) 144 function sTerm(y,n) { 145 var offDate = new Date((31556925974.7*(y-1900)+sTermInfo[n]*60000)+Date.UTC(1900,0,6,2,5)); 146 return(offDate.getUTCDate()) 147 } 148 //保存y年m+1月的相关信息 149 var fat=mat=9; 150 var eve=0; 151 function calendar(y,m) { 152 fat=mat=0; 153 var sDObj,lDObj,lY,lM,lD=1,lL,lX=0,tmp1,tmp2; 154 var lDPOS = new Array(3); 155 var n = 0; 156 var firstLM = 0; 157 sDObj = new Date(y,m,1); //当月第一天的日期 158 this.length = solarDays(y,m); //公历当月天数 159 this.firstWeek = sDObj.getDay(); //公历当月1日星期几 160 if ((m+1)==5){fat=sDObj.getDay()} 161 if ((m+1)==6){mat=sDObj.getDay()} 162 for(var i=0;i<this.length;i++) { 163 if(lD>lX) { 164 sDObj = new Date(y,m,i+1); //当月第一天的日期 165 lDObj = new Dianaday(sDObj); //农历 166 lY = lDObj.year; //农历年 167 lM = lDObj.month; //农历月 168 lD = lDObj.day; //农历日 169 lL = lDObj.isLeap; //农历是否闰月 170 lX = lL? leapDays(lY): monthDays(lY,lM); //农历当月最後一天 171 if (lM==12){eve=lX} 172 if(n==0) firstLM = lM; 173 lDPOS[n++] = i-lD+1; 174 } 175 this[i] = new calElement(y,m+1,i+1,nStr1[(i+this.firstWeek)%7],lY,lM,lD++,lL); 176 if((i+this.firstWeek)%7==0){ 177 this[i].color = 'red'; //周日颜色 178 } 179 } 180 //节气 181 tmp1=sTerm(y,m*2)-1; 182 tmp2=sTerm(y,m*2+1)-1; 183 this[tmp1].solarTerms = solarTerm[m*2]; 184 this[tmp2].solarTerms = solarTerm[m*2+1]; 185 if((this.firstWeek+12)%7==5) //黑色星期五 186 this[12].solarFestival += '黑色星期五'; 187 if(y==tY && m==tM) this[tD-1].isToday = true; //今日 188 } 189 //用中文显示农历的日期 190 function cDay(d){ 191 var s; 192 switch (d) { 193 case 10: 194 s = '初十'; break; 195 case 20: 196 s = '二十'; break; 197 break; 198 case 30: 199 s = '三十'; break; 200 break; 201 default : 202 s = nStr2[Math.floor(d/10)]; 203 s += nStr1[d%10]; 204 } 205 return(s); 206 } 207 //在表格中显示公历和农历的日期,以及相关节日 http://www.cnblogs.com/jihua/ 208 var cld; 209 function drawCld(SY,SM) { 210 var TF=true; 211 var p1=p2=""; 212 var i,sD,s,size; 213 cld = new calendar(SY,SM); 214 GZ.innerHTML = ' 【'+Animals[(SY-4)%12]+'】'; //生肖 215 for(i=0;i<42;i++) { 216 sObj=eval('SD'+ i); 217 lObj=eval('LD'+ i); 218 sObj.className = ''; 219 sD = i - cld.firstWeek; 220 if(sD>-1 && sD<cld.length) { //日期内 221 sObj.innerHTML = sD+1; 222 if(cld[sD].isToday){ sObj.style.color = '#9900FF';} //今日颜色 223 else{sObj.style.color = '';} 224 if(cld[sD].lDay==1){ //显示农历月 225 lObj.innerHTML = '<b>'+(cld[sD].isLeap?'闰':'') + cld[sD].lMonth + '月' + (monthDays(cld[sD].lYear,cld[sD].lMonth)==29?'小':'大')+'</b>'; 226 } 227 else{lObj.innerHTML = cDay(cld[sD].lDay);} //显示农历日 228 var Slfw=Ssfw=null; 229 s=cld[sD].solarFestival; 230 for (var ipp=0;ipp<lFtv.length;ipp++){ //农历节日 231 if (parseInt(lFtv[ipp].substr(0,2))==(cld[sD].lMonth)){ 232 if (parseInt(lFtv[ipp].substr(2,4))==(cld[sD].lDay)){ 233 lObj.innerHTML=lFtv[ipp].substr(5); 234 Slfw=lFtv[ipp].substr(5); 235 } 236 } 237 if (12==(cld[sD].lMonth)){ //判断是否为除夕 238 if (eve==(cld[sD].lDay)){lObj.innerHTML="除夕";Slfw="除夕";} 239 } 240 } 241 for (var ipp=0;ipp<sFtv.length;ipp++){ //公历节日 242 if (parseInt(sFtv[ipp].substr(0,2))==(SM+1)){ 243 if (parseInt(sFtv[ipp].substr(2,4))==(sD+1)){ 244 lObj.innerHTML=sFtv[ipp].substr(5); 245 Ssfw=sFtv[ipp].substr(5); 246 } 247 } 248 } 249 if ((SM+1)==5){ //母亲节 250 if (fat==0){ 251 if ((sD+1)==7){Ssfw="母亲节";lObj.innerHTML="母亲节"} 252 } 253 else if (fat<9){ 254 if ((sD+1)==((7-fat)+8)){Ssfw="母亲节";lObj.innerHTML="母亲节"} 255 } 256 } 257 if ((SM+1)==6){ //父亲节 258 if (mat==0){ 259 if ((sD+1)==14){Ssfw="父亲节";lObj.innerHTML="父亲节"} 260 } 261 else if (mat<9){ 262 if ((sD+1)==((7-mat)+15)){Ssfw="父亲节";lObj.innerHTML="父亲节"} 263 } 264 } 265 if (s.length<=0){ //设置节气的颜色 266 s=cld[sD].solarTerms; 267 if(s.length>0) s = s.fontcolor('limegreen'); 268 } 269 if(s.length>0) {lObj.innerHTML=s;Slfw=s;} //节气 270 if ((Slfw!=null)&&(Ssfw!=null)){ 271 lObj.innerHTML=Slfw+"/"+Ssfw; 272 } 273 } 274 else { //非日期 275 sObj.innerHTML = ''; 276 lObj.innerHTML = ''; 277 } 278 } 279 } 280 //在下拉列表中选择年月时,调用自定义函数drawCld(),显示公历和农历的相关信息 281 function changeCld() { 282 var y,m; 283 y=CLD.SY.selectedIndex+1900; 284 m=CLD.SM.selectedIndex; 285 drawCld(y,m); 286 } 287 //用自定义变量保存当前系统中的年月日 288 var Today = new Date(); 289 var tY = Today.getFullYear(); 290 var tM = Today.getMonth(); 291 var tD = Today.getDate(); 292 //打开页时,在下拉列表中显示当前年月,并调用自定义函数drawCld(),显示公历和农历的相关信息 293 function initial() { 294 CLD.SY.selectedIndex=tY-1900; 295 CLD.SM.selectedIndex=tM; 296 drawCld(tY,tM); 297 } 298 //--> 299 </SCRIPT> 300 <BODY onload=initial()> 301 <CENTER> 302 <FORM name=CLD> 303 <TABLE> 304 <TR> 305 <TD align=middle> 306 <TABLE border=1 cellpadding="0" cellspacing="0" bordercolordark="#FFFFFF" bordercolor="#ffffff" bordercolorlight="#EEEEEE"> 307 <TR bgcolor="#006600"> 308 <TD colSpan=7><FONT color=#ffffff style="FONT-SIZE: 9pt">公历 309 <SELECT name=SY onchange=changeCld() style="FONT-SIZE: 9pt"> 310 <SCRIPT language="JavaScript"> 311 for(i=1900;i<2050;i++) document.write('<option>'+i); 312 </SCRIPT> 313 </SELECT> 年 <SELECT name=SM onchange=changeCld() style="FONT-SIZE: 9pt"> 314 <SCRIPT language="JavaScript"> 315 for(i=1;i<13;i++) document.write('<option>'+i); 316 </SCRIPT> 317 </SELECT> 月 </FONT> <FONT color=#ffffff face=宋体 id=GZ style="FONT-SIZE: 12pt"></FONT><BR></TD> 318 </TR> 319 <TR align=middle bgColor=#e0e0e0> 320 <TD width=54 style="font-size:9pt; padding:5pt;">日</TD> 321 <TD width=54 style="font-size:9pt ">一</TD> 322 <TD width=54 style="font-size:9pt ">二</TD> 323 <TD width=54 style="font-size:9pt ">三</TD> 324 <TD width=54 style="font-size:9pt ">四</TD> 325 <TD width=54 style="font-size:9pt ">五</TD> 326 <TD width=54 style="font-size:9pt ">六</TD></TR> 327 <SCRIPT language="JavaScript"> 328 var gNum; 329 for(i=0;i<6;i++) { 330 document.write('<tr align=center>'); 331 for(j=0;j<7;j++) { 332 gNum = i*7+j; 333 document.write('<td id="GD' + gNum +'"><font id="SD' + gNum +'" size=2 face="Arial Black"'); 334 if(j == 0) document.write(' color=red'); 335 if(j == 6) document.write(' color=#000080'); 336 document.write(' TITLE=""> </font><br><font id="LD' + gNum + '" size=2 style="font-size:9pt"> </font></td>'); 337 } 338 document.write('</tr>'); 339 } 340 </SCRIPT> 341 </TABLE> 342 </TD> 343 </TR> 344 </TABLE> 345 </FORM> 346 </CENTER> 347 </BODY> 348 </HTML>