(function(){ /***************************************************************************** 日期资料 *****************************************************************************/ var lunarinfo=new array( 0x4bd8,0x4ae0,0xa570,0x54d5,0xd260,0xd950,0x5554,0x56af,0x9ad0,0x55d2, 0x4ae0,0xa5b6,0xa4d0,0xd250,0xd255,0xb54f,0xd6a0,0xada2,0x95b0,0x4977, 0x497f,0xa4b0,0xb4b5,0x6a50,0x6d40,0xab54,0x2b6f,0x9570,0x52f2,0x4970, 0x6566,0xd4a0,0xea50,0x6a95,0x5adf,0x2b60,0x86e3,0x92ef,0xc8d7,0xc95f, 0xd4a0,0xd8a6,0xb55f,0x56a0,0xa5b4,0x25df,0x92d0,0xd2b2,0xa950,0xb557, 0x6ca0,0xb550,0x5355,0x4daf,0xa5b0,0x4573,0x52bf,0xa9a8,0xe950,0x6aa0, 0xaea6,0xab50,0x4b60,0xaae4,0xa570,0x5260,0xf263,0xd950,0x5b57,0x56a0, 0x96d0,0x4dd5,0x4ad0,0xa4d0,0xd4d4,0xd250,0xd558,0xb540,0xb6a0,0x95a6, 0x95bf,0x49b0,0xa974,0xa4b0,0xb27a,0x6a50,0x6d40,0xaf46,0xab60,0x9570, 0x4af5,0x4970,0x64b0,0x74a3,0xea50,0x6b58,0x5ac0,0xab60,0x96d5,0x92e0, 0xc960,0xd954,0xd4a0,0xda50,0x7552,0x56a0,0xabb7,0x25d0,0x92d0,0xcab5, 0xa950,0xb4a0,0xbaa4,0xad50,0x55d9,0x4ba0,0xa5b0,0x5176,0x52bf,0xa930, 0x7954,0x6aa0,0xad50,0x5b52,0x4b60,0xa6e6,0xa4e0,0xd260,0xea65,0xd530, 0x5aa0,0x76a3,0x96d0,0x4afb,0x4ad0,0xa4d0,0xd0b6,0xd25f,0xd520,0xdd45, 0xb5a0,0x56d0,0x55b2,0x49b0,0xa577,0xa4b0,0xaa50,0xb255,0x6d2f,0xada0, 0x4b63,0x937f,0x49f8,0x4970,0x64b0,0x68a6,0xea5f,0x6b20,0xa6c4,0xaaef, 0x92e0,0xd2e3,0xc960,0xd557,0xd4a0,0xda50,0x5d55,0x56a0,0xa6d0,0x55d4, 0x52d0,0xa9b8,0xa950,0xb4a0,0xb6a6,0xad50,0x55a0,0xaba4,0xa5b0,0x52b0, 0xb273,0x6930,0x7337,0x6aa0,0xad50,0x4b55,0x4b6f,0xa570,0x54e4,0xd260, 0xe968,0xd520,0xdaa0,0x6aa6,0x56df,0x4ae0,0xa9d4,0xa4d0,0xd150,0xf252, 0xd520); var solarmonth=new array(31,28,31,30,31,30,31,31,30,31,30,31); var gan=new array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸"); var zhi=new array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"); var animals=new array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"); var solarterm = new array("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"); 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); var nstr1 = new array('日','一','二','三','四','五','六','七','八','九','十'); var nstr2 = new array('初','十','廿','卅','□'); var nstr3 = new array('正','二','三','四','五','六','七','八','九','十','十一','十二'); var monthname = new array("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"); //公历节日 *表示放假日 var sftv = new array( "0101*元旦", "0214 情人节", "0308 国际妇女节", "0312 植树节", "0315 消费者权益日", "0401 愚人节", "0501 国际劳动节", "0504 青年节", "0601 国际儿童节", "0701 建党节,香港回归纪念", "0707 抗战纪念日", "0801 建军节", "0909 毛泽东逝世日", "0910 中国教师节", "1001*国庆节", "1006 老人节", "1127 感恩节", "1209 12.9纪念日", "1213 南京大屠杀日", "1220 澳门回归纪念", "1225 圣诞节", "1226 毛泽东诞辰纪念" ); //某月的第几个星期几。 5,6,7,8 表示到数第 1,2,3,4 个星期几 var wftv = new array( "0520 母亲节", "0630 父亲节", "1144 感恩节"); //农历节日 var lftv = new array( "0101*春节", "0115 元宵节", "0202 龙抬头节", //"0323 妈祖生辰 (天上圣母诞辰)", "0505 端午节", "0707 七七中国情人节", "0815 中秋节", "0909 重阳节", "1208 腊八节", "1223 小年", "0100*除夕"); /***************************************************************************** 日期计算 *****************************************************************************/ //====================================== 返回农历 y年的总天数 function lyeardays(y) { var i, sum = 348; for(i=0x8000; i>0x8; i>>=1) sum += (lunarinfo[y-1900] & i)? 1: 0; return(sum+leapdays(y)); } //====================================== 返回农历 y年闰月的天数 function leapdays(y) { if(leapmonth(y)) return( (lunarinfo[y-1899]&0xf)==0xf? 30: 29); else return(0); } //====================================== 返回农历 y年闰哪个月 1-12 , 没闰返回 0 function leapmonth(y) { var lm = lunarinfo[y-1900] & 0xf; return(lm==0xf?0:lm); } //====================================== 返回农历 y年m月的总天数 function monthdays(y,m) { return( (lunarinfo[y-1900] & (0x10000>>m))? 30: 29 ); } //====================================== 算出农历, 传入日期控件, 返回农历日期控件 // 该控件属性有 .year .month .day .isleap function 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<2100 && offset>0; i++) { temp=lyeardays(i); offset-=temp; } if(offset<0) { offset+=temp; i--; } this.year = i; leap = leapmonth(i); //闰哪个月 this.isleap = false; for(i=1; i<13 && offset>0; i++) { //闰月 if(leap>0 && i==(leap+1) && this.isleap==false) { --i; this.isleap = true; temp = leapdays(this.year); } else { temp = monthdays(this.year, i); } //解除闰月 if(this.isleap==true && i==(leap+1)) this.isleap = false; offset -= temp; } if(offset==0 && leap>0 && i==leap+1) if(this.isleap) { this.isleap = false; } else { this.isleap = true; --i; } if(offset<0){ offset += temp; --i; } this.month = i; this.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); else return(solarmonth[m]); } //============================== 传入 offset 返回干支, 0=甲子 function cyclical(num) { return(gan[num%10]+zhi[num%12]); } //============================== 阴历属性 function calelement(syear,smonth,sday,week,lyear,lmonth,lday,isleap,cyear,cmonth,cday) { this.istoday = false; //瓣句 this.syear = syear; //公元年4位数字 this.smonth = smonth; //公元月数字 this.sday = sday; //公元日数字 this.week = week; //星期, 1个中文 //农历 this.lyear = lyear; //公元年4位数字 this.lmonth = lmonth; //农历月数字 this.lday = lday; //农历日数字 this.isleap = isleap; //是否为农历闰月? //八字 this.cyear = cyear; //年柱, 2个中文 this.cmonth = cmonth; //月柱, 2个中文 this.cday = cday; //日柱, 2个中文 this.color = ''; this.lunarfestival = ''; //农历节日 this.solarfestival = ''; //公历节日 this.solarterms = ''; //节气 } //===== 某年的第n个节气为几日(从0小寒起算) function sterm(y,n) { var offdate = new date( ( 31556925974.7*(y-1900) + sterminfo[n]*60000 ) + date.utc(1900,0,6,2,5) ); return(offdate.getutcdate()); } //============================== 返回阴历控件 (y年,m+1月) /* 功能说明: 返回整个月的日期资料控件 使用方式: obj = new calendar(年,零起算月); obj.length 返回当月最大日 obj.firstweek 返回当月一日星期 由 obj[日期].属性名称 即可取得各项值 obj[日期].istoday 返回是否为今日 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); //当月一日日期 this.length = solardays(y,m); //公历当月天数 this.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;ilx) { sdobj = new date(y,m,i+1); //当月一日日期 ldobj = new lunar(sdobj); //农历 ly = ldobj.year; //农历年 lm = ldobj.month; //农历月 ld = ldobj.day; //农历日 ll = ldobj.isleap; //农历是否闰月 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,isleap, //cyear,cmonth,cday this[i] = new calelement(y, m+1, i+1, nstr1[(i+this.firstweek)%7], ly, lm, ld++, ll, cy ,cm, cd ); } //节气 tmp1=sterm(y,m*2 )-1; tmp2=sterm(y,m*2+1)-1; this[tmp1].solarterms = solarterm[m*2]; this[tmp2].solarterms = solarterm[m*2+1]; if(m==3) this[tmp1].color = 'red'; //清明颜色 //公历节日 for(i in sftv) if(sftv[i].match(/^(\d{2})(\d{2})([\s\*])(.+)$/)) if(number(regexp.$1)==(m+1)) { this[number(regexp.$2)-1].solarfestival += regexp.$4 + ' '; if(regexp.$3=='*') this[number(regexp.$2)-1].color = 'red'; } //月周节日 for(i in wftv) if(wftv[i].match(/^(\d{2})(\d)(\d)([\s\*])(.+)$/)) if(number(regexp.$1)==(m+1)) { tmp1=number(regexp.$2); tmp2=number(regexp.$3); if(tmp1<5) this[((this.firstweek>tmp2)?7:0) + 7*(tmp1-1) + tmp2 - this.firstweek].solarfestival += regexp.$5 + ' '; else { tmp1 -= 5; tmp3 = (this.firstweek+this.length-1)%7; //当月最后一天星期? this[this.length - tmp3 - 7*tmp1 + tmp2 - (tmp2>tmp3?7:0) - 1 ].solarfestival += regexp.$5 + ' '; } } //农历节日 for(i in lftv) if(lftv[i].match(/^(\d{2})(.{2})([\s\*])(.+)$/)) { tmp1=number(regexp.$1)-firstlm; if(tmp1==-11) tmp1=1; if(tmp1 >=0 && tmp1= 0 && tmp2'; //if(document.getelementbyid("gd"))document.getelementbyid("gd").classname = cld[td-1].color; //if(document.getelementbyid("tw"))document.getelementbyid("tw").classname = cld[td-1].color; s = cld[td-1].lunarfestival;//农历节日 s+= cld[td-1].solarfestival ? ' '+cld[td-1].solarfestival : '';//国历节日 s+= cld[td-1].solarterms ? ' '+cld[td-1].solarterms : '';//廿四节气 if(document.getelementbyid("jq"))document.getelementbyid("jq").innerhtml = s ? " "+s : ''; } var today = new date(); var ty = today.getfullyear(); var tm = today.getmonth(); var td = today.getdate(); function initial() { drawcld(ty,tm); } //初始化日历信息 initial(); //--> })();