javascript实现带节日和农历的日历特效
带节日和农历的脚本:
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">
<TITLE>带农历的日历</TITLE>
<SCRIPTlanguage="JavaScript">
<!--
varlunarInfo=newArray(
0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0)
varsolarMonth=newArray(31,28,31,30,31,30,31,31,30,31,30,31);
varAnimals=newArray("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");
varsolarTerm=newArray("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至");
varsTermInfo=newArray(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758);
varnStr1=newArray('日','一','二','三','四','五','六','七','八','九','十');
varnStr2=newArray('初','十','廿','卅');
//公历节日
varsFtv=newArray(
"0101元旦",
"0214情人节",
"0308妇女节",
"0312植树节",
"0315消费者权益日",
"0401愚人节",
"0501劳动节",
"0504青年节",
"0512护士节",
"0601儿童节",
"0701建党节",
"0801建军节",
"0910教师节",
"0928孔子诞辰",
"1001国庆节",
"1006老人节",
"1024联合国日",
"1224平安夜",
"1225圣诞节")
//农历节日
varlFtv=newArray(
"0101春节",
"0115元宵节",
"0505端午节",
"0707七夕情人节",
"0715中元节",
"0815中秋节",
"0909重阳节",
"1208腊八节",
"1224小年")
//返回农历y年的总天数
functionlYearDays(y){
vari,sum=348;
for(i=0x8000;i>0x8;i>>=1)sum+=(lunarInfo[y-1900]&i)?1:0;
return(sum+leapDays(y));
}
//返回农历y年闰月的天数
functionleapDays(y){
if(leapMonth(y)) return((lunarInfo[y-1900]&0x10000)?30:29);
elsereturn(0);
}
//判断y年的农历中那个月是闰月,不是闰月返回0
functionleapMonth(y){
return(lunarInfo[y-1900]&0xf);
}
//返回农历y年m月的总天数
functionmonthDays(y,m){
return((lunarInfo[y-1900]&(0x10000>>m))?30:29);
}
//算出当前月第一天的农历日期和当前农历日期下一个月农历的第一天日期
functionDianaday(objDate){
vari,leap=0,temp=0;
varbaseDate=newDate(1900,0,31);
varoffset =(objDate-baseDate)/86400000;
this.dayCyl=offset+40;
this.monCyl=14;
for(i=1900;i<2050&&offset>0;i++){
temp=lYearDays(i)
offset-=temp;
this.monCyl+=12;
}
if(offset<0){
offset+=temp;
i--;
this.monCyl-=12;
}
this.year=i;
this.yearCyl=i-1864;
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(this.isLeap==false)this.monCyl++;
}
if(offset==0&&leap>0&&i==leap+1)
if(this.isLeap){this.isLeap=false;}
else{this.isLeap=true;--i;--this.monCyl;}
if(offset<0){offset+=temp;--i;--this.monCyl;}
this.month=i;
this.day=offset+1;
}
//返回公历y年m+1月的天数
functionsolarDays(y,m){
if(m==1)
return(((y%4==0)&&(y%100!=0)||(y%400==0))?29:28);
else
return(solarMonth[m]);
}
//记录公历和农历某天的日期
functioncalElement(sYear,sMonth,sDay,week,lYear,lMonth,lDay,isLeap){
this.isToday=false;
//公历
this.sYear=sYear;
this.sMonth=sMonth;
this.sDay=sDay;
this.week=week;
//农历
this.lYear=lYear;
this.lMonth=lMonth;
this.lDay=lDay;
this.isLeap=isLeap;
//节日记录
this.lunarFestival='';//农历节日
this.solarFestival='';//公历节日
this.solarTerms='';//节气
}
//返回某年的第n个节气为几日(从0小寒起算)
functionsTerm(y,n){
varoffDate=newDate((31556925974.7*(y-1900)+sTermInfo[n]*60000)+Date.UTC(1900,0,6,2,5));
return(offDate.getUTCDate())
}
//保存y年m+1月的相关信息
varfat=mat=9;
vareve=0;
functioncalendar(y,m){
fat=mat=0;
varsDObj,lDObj,lY,lM,lD=1,lL,lX=0,tmp1,tmp2;
varlDPOS=newArray(3);
varn=0;
varfirstLM=0;
sDObj=newDate(y,m,1); //当月第一天的日期
this.length=solarDays(y,m); //公历当月天数
this.firstWeek=sDObj.getDay(); //公历当月1日星期几
if((m+1)==5){fat=sDObj.getDay()}
if((m+1)==6){mat=sDObj.getDay()}
for(vari=0;i<this.length;i++){
if(lD>lX){
sDObj=newDate(y,m,i+1); //当月第一天的日期
lDObj=newDianaday(sDObj); //农历
lY=lDObj.year; //农历年
lM=lDObj.month; //农历月
lD=lDObj.day; //农历日
lL=lDObj.isLeap; //农历是否闰月
lX=lL?leapDays(lY):monthDays(lY,lM);//农历当月最後一天
if(lM==12){eve=lX}
if(n==0)firstLM=lM;
lDPOS[n++]=i-lD+1;
}
this[i]=newcalElement(y,m+1,i+1,nStr1[(i+this.firstWeek)%7],lY,lM,lD++,lL);
if((i+this.firstWeek)%7==0){
this[i].color='red'; //周日颜色
}
}
//节气
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((this.firstWeek+12)%7==5) //黑色星期五
this[12].solarFestival+='黑色星期五';
if(y==tY&&m==tM)this[tD-1].isToday=true; //今日
}
//用中文显示农历的日期
functioncDay(d){
vars;
switch(d){
case10:
s='初十';break;
case20:
s='二十';break;
break;
case30:
s='三十';break;
break;
default:
s=nStr2[Math.floor(d/10)];
s+=nStr1[d%10];
}
return(s);
}
varcld;
functiondrawCld(SY,SM){
varTF=true;
varp1=p2="";
vari,sD,s,size;
cld=newcalendar(SY,SM);
GZ.innerHTML=' 【'+Animals[(SY-4)%12]+'】'; //生肖
for(i=0;i<42;i++){
sObj=eval('SD'+i);
lObj=eval('LD'+i);
sObj.className='';
sD=i-cld.firstWeek;
if(sD>-1&&sD<cld.length){//日期内
sObj.innerHTML=sD+1;
if(cld[sD].isToday){sObj.style.color='#9900FF';}//今日颜色
else{sObj.style.color='';}
if(cld[sD].lDay==1){//显示农历月
lObj.innerHTML='<b>'+(cld[sD].isLeap?'闰':'')+cld[sD].lMonth+'月'+(monthDays(cld[sD].lYear,cld[sD].lMonth)==29?'小':'大')+'</b>';
}
else{lObj.innerHTML=cDay(cld[sD].lDay);} //显示农历日
varSlfw=Ssfw=null;
s=cld[sD].solarFestival;
for(varipp=0;ipp<lFtv.length;ipp++){ //农历节日
if(parseInt(lFtv[ipp].substr(0,2))==(cld[sD].lMonth)){
if(parseInt(lFtv[ipp].substr(2,4))==(cld[sD].lDay)){
lObj.innerHTML=lFtv[ipp].substr(5);
Slfw=lFtv[ipp].substr(5);
}
}
if(12==(cld[sD].lMonth)){ //判断是否为除夕
if(eve==(cld[sD].lDay)){lObj.innerHTML="除夕";Slfw="除夕";}
}
}
for(varipp=0;ipp<sFtv.length;ipp++){ //公历节日
if(parseInt(sFtv[ipp].substr(0,2))==(SM+1)){
if(parseInt(sFtv[ipp].substr(2,4))==(sD+1)){
lObj.innerHTML=sFtv[ipp].substr(5);
Ssfw=sFtv[ipp].substr(5);
}
}
}
if((SM+1)==5){ //母亲节
if(fat==0){
if((sD+1)==7){Ssfw="母亲节";lObj.innerHTML="母亲节"}
}
elseif(fat<9){
if((sD+1)==((7-fat)+8)){Ssfw="母亲节";lObj.innerHTML="母亲节"}
}
}
if((SM+1)==6){ //父亲节
if(mat==0){
if((sD+1)==14){Ssfw="父亲节";lObj.innerHTML="父亲节"}
}
elseif(mat<9){
if((sD+1)==((7-mat)+15)){Ssfw="父亲节";lObj.innerHTML="父亲节"}
}
}
if(s.length<=0){ //设置节气的颜色
s=cld[sD].solarTerms;
if(s.length>0)s=s.fontcolor('limegreen');
}
if(s.length>0){lObj.innerHTML=s;Slfw=s;} //节气
if((Slfw!=null)&&(Ssfw!=null)){
lObj.innerHTML=Slfw+"/"+Ssfw;
}
}
else{//非日期
sObj.innerHTML='';
lObj.innerHTML='';
}
}
}
//在下拉列表中选择年月时,调用自定义函数drawCld(),显示公历和农历的相关信息
functionchangeCld(){
vary,m;
y=CLD.SY.selectedIndex+1900;
m=CLD.SM.selectedIndex;
drawCld(y,m);
}
//用自定义变量保存当前系统中的年月日
varToday=newDate();
vartY=Today.getFullYear();
vartM=Today.getMonth();
vartD=Today.getDate();
//打开页时,在下拉列表中显示当前年月,并调用自定义函数drawCld(),显示公历和农历的相关信息
functioninitial(){
CLD.SY.selectedIndex=tY-1900;
CLD.SM.selectedIndex=tM;
drawCld(tY,tM);
}
//-->
</SCRIPT>
<BODYonload=initial()>
<CENTER>
<FORMname=CLD>
<TABLE>
<TR>
<TDalign=middle>
<TABLEborder=1cellpadding="0"cellspacing="0"bordercolordark="#FFFFFF"bordercolor="#ffffff"bordercolorlight="#EEEEEE">
<TRbgcolor="#006600">
<TDcolSpan=7><FONTcolor=#ffffffstyle="FONT-SIZE:9pt">公历
<SELECTname=SYonchange=changeCld()style="FONT-SIZE:9pt">
<SCRIPTlanguage="JavaScript">
for(i=1900;i<2050;i++)document.write('<option>'+i);
</SCRIPT>
</SELECT>年<SELECTname=SMonchange=changeCld()style="FONT-SIZE:9pt">
<SCRIPTlanguage="JavaScript">
for(i=1;i<13;i++)document.write('<option>'+i);
</SCRIPT>
</SELECT>月</FONT><FONTcolor=#ffffffface=宋体id=GZstyle="FONT-SIZE:12pt"></FONT><BR></TD>
</TR>
<TRalign=middlebgColor=#e0e0e0>
<TDwidth=54style="font-size:9pt;padding:5pt;">日</TD>
<TDwidth=54style="font-size:9pt">一</TD>
<TDwidth=54style="font-size:9pt">二</TD>
<TDwidth=54style="font-size:9pt">三</TD>
<TDwidth=54style="font-size:9pt">四</TD>
<TDwidth=54style="font-size:9pt">五</TD>
<TDwidth=54style="font-size:9pt">六</TD></TR>
<SCRIPTlanguage="JavaScript">
vargNum;
for(i=0;i<6;i++){
document.write('<tralign=center>');
for(j=0;j<7;j++){
gNum=i*7+j;
document.write('<tdid="GD'+gNum+'"><fontid="SD'+gNum+'"size=2face="ArialBlack"');
if(j==0)document.write('color=red');
if(j==6)document.write('color=#000080');
document.write('TITLE=""></font><br><fontid="LD'+gNum+'"size=2style="font-size:9pt"></font></td>');
}
document.write('</tr>');
}
</SCRIPT>
</TABLE>
</TD>
</TR>
</TABLE>
</FORM>
</CENTER>
</BODY>
</HTML>
非常少见的,带节日和节气以及农历的日历特效,希望小伙伴们能够喜欢