带节日和农历的js日历

带农历的脚本:

http://keleyi.com/keleyi/phtml/jstexiao/11.htm

http://keleyi.com/tools/rili/

  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 = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【'+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>

web前端:http://www.cnblogs.com/jihua/p/webfront.html

原文地址:https://www.cnblogs.com/jihua/p/jsrili.html