⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 万年历.htm

📁 万年历javascript 做的,有阳历
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<HTML><HEAD><TITLE>月历</TITLE>
<META 
content="农历; 阳历; 月历; 节日; 时区; 节气; 八字; 干支; 生肖; gregorian solar; chinese lunar; calendar;" 
name=keywords>
<META content=All name=robots>
<META content="gregorian solar calendar and chinese lunar calendar" 
name=description>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<SCRIPT language=JavaScript>
<!-- 
	var lunarInfo=new Array(
		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
	);

	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 monthName = new Array("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC");

	//國曆節日 *表示放假日
	var sFtv = new Array(
		"0101*元旦",
		"0111 司法日",
		"0115 ",
		"0123 自由日",
		"0204 ",
		"0214 情人节",
		"0215 ",
		"0219 ",
		"0228*和平日",
		"0301 ",
		"0305 ",
		"0308 妇女节",
		"0312 植树节",
		"0317 ",
		"0320 邮政日",
		"0321 气象节",
		"0325 美术节",
		"0326 ",
		"0329 青年节 ",
		"0330 ",
		"0401 愚人节",
		"0404 ",
		"0405 ",
		"0407 ",
		"0501 劳动节",
		"0504 青年节",
		"0505 舞蹈节",
		"0512 护士节",
		"0603 禁烟节",
		"0606 ",
		"0609 ",
		"0616 警察节",
		"0614 ",
		"0701 ",
		"0704 ",
		"0801 建军节",
		"0808 父亲节",
		"0814 空军节",
		"0827 ",
		"0901 记者节",
		"0903 军人节",
		"0909 体育节 律师节",
		"0913 法律日",
		"0928 教師节 ",
		"1001 国庆节",
		"1010",
		"1021 ",
		"1024 联合国日",
		"1025 ",
		"1031 ",
		"1101 商人节",
		"1111 工业节 ",
		"1112 ",
		"1121 防空节",
		"1205 海员节",
		"1210 人权节",
		"1212 ",
		"1225",
		"1226 ",
		"1227 ",
		"1228 電信日",
		"1231 "
	);

	//農曆節日 *表示放假日
	var lFtv = new Array(
		"0101*春节",
		"0102",
		"0103",
		"0104 ",
		"0105 ",
		"0106  ",
		"0109 ",
		"0115 元宵节",
		"0202 ",
		"0203 ",
		"0219 ",
		"0303 ",
		"0315 ",
		"0323 ",
		"0408 ",
		"0505*端午节 诗人节",
		"0619 ",
		"0701 鬼节",
		"0707 七夕情人节",
		"0715 ",
		"0718 ",
		"0800 ",
		"0815*中秋节",
		"0909 重阳节",
		"1003 ",
		"1005 ",
		"1208 ",
		"1216 ",
		"1224 ",
		"0100*除夕"
	);

	//某月的第幾個星期幾
	var wFtv = new Array(
		"0131 ",
		"0231 ",
		"0520 母亲节",
		"0530 ",
		"0531 ",
		"0716 合作节",
		"0730 ",
		"0811 ",
		"0911 ",
		"1021 ",
		"1144 "
	)

/*****************************************************************************
                                      日期計算
*****************************************************************************/

	//====================================== 傳回農曆 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-1900] & 0x10000)? 30: 29)
		else return(0)
	}

	//====================================== 傳回農曆 y年閏哪個月 1-12 , 沒閏傳回 0
	function leapMonth(y) {
		return(lunarInfo[y-1900] & 0xf)
	}

	//====================================== 傳回農曆 y年m月的總天數
	function monthDays(y,m) {
		return( (lunarInfo[y-1900] & (0x10000>>m))? 30: 29 )
	}

	//====================================== 算出農曆, 傳入日期物件, 傳回農曆日期物件
	//                                       該物件屬性有 .year .month .day .isLeap .yearCyl .dayCyl .monCyl
	function Lunar(objDate) {

		var i, leap=0, temp=0
		var baseDate = new Date(1900,0,31)
		var offset   = (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月的天數
	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;
		this.sMonth     = sMonth;
		this.sDay       = sDay;
		this.week       = week;
		//農曆
		this.lYear      = lYear;
		this.lMonth     = lMonth;
		this.lDay       = lDay;
		this.isLeap     = isLeap;
		//干支
		this.cYear      = cYear;
		this.cMonth     = cMonth;
		this.cDay       = cDay;

		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月)
	function calendar(y,m) {
		var sDObj, lDObj, lY, lM, lD=1, lL, lX=0, tmp1, tmp2
		var lDPOS = new Array(3)
		var n = 0
		var firstLM = 0

		sDObj = new Date(y,m,1)            //當月一日日期

		this.length    = solarDays(y,m)    //國曆當月天數
		this.firstWeek = sDObj.getDay()    //國曆當月1日星期幾


		for(var i=0;i<this.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.isLeap         //農曆是否閏月
				lX    = lL? leapDays(lY): monthDays(lY,lM) //農曆當月最後一天

				if(n==0) firstLM = lM
				lDPOS[n++] = i-lD+1
			}

			//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,
                               cyclical(lDObj.yearCyl) ,cyclical(lDObj.monCyl), cyclical(lDObj.dayCyl++) )


			if((i+this.firstWeek)%7==0)   this[i].color = 'red'  //週日顏色
			if((i+this.firstWeek)%14==13) 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(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)
					this[((this.firstWeek>tmp2)?7:0) + 7*(tmp1-1) + tmp2 - this.firstWeek].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<n) {
						tmp2 = lDPOS[tmp1] + Number(RegExp.$2) -1
						if( tmp2 >= 0 && tmp2<this.length) {
							this[tmp2].lunarFestival += RegExp.$4 + ' '
							if(RegExp.$3=='*') this[tmp2].color = 'red'
						}
					}
			}

   
		if((this.firstWeek+12)%7==5)
			this[12].solarFestival += '十六 '

		//今日
		if(y==tY && m==tM) this[tD-1].isToday = true;

	}

	//====================== 中文日期
	function cDay(d){
		var s;

		switch (d) {
			case 10:
				s = '初十'; break;
			case 20:
				s = '二十'; break;
				break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -