js 公历日期转农历带节假日

参照地址:https://www.jb51.net/article/60616.htm

首先获取公历节假日代码:

var basejieri={'0101':'元旦','0214':'情人节','0308':'妇女节','0312':'植树节','0401':'愚人节','0501':'劳动节','0504':'青年节','0512':'护士节','0601':'儿童节','0701':'建党节','0801':'建军节','0910':'教师节','1001':'国庆节','1111':'光棍节','1224':'平安夜','1225':'圣诞节'};

//农历的月日
var parHoliday = ((month+1) > 9 ? (month+1) : "0"+(month+1)) + "" + (i > 9 ? i : "0" + i);
    if(basejieri.hasOwnProperty(parHoliday)) {
        aData = basejieri[parHoliday];
    }

调用方法:

//调用js方法,参数分别是公历年、月、日;返回农历日期或农历节假日
var aDate = getLunarCalendar(year, month, i);

公历转农历js:

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 nStr1 = new Array('日','一','二','三','四','五','六','七','八','九','十','十一','十二');
var nStr2 = new Array('初','十','廿','三十');
//农历节日
var lunarHoliday = {"0101":"春节","0115":"元宵节","0505":"端午节","0707":"七夕情人节","0715":"中元节","0815":"中秋节","0909":"重阳节","1208":"腊八节","1224":"小年"};
//节气
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);

//判断y年的农历中那个月是闰月
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);
}

//返回农历y年闰月的天数
function leapDays(y) {
	if (leapMonth(y)) {
		return ((lunarInfo[y - 1899] & 0xf) == 0xf ? 30 : 29);
	}else{
		return (0);
	}
}

//返回农历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));
}

// calcute 农历年月日
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;
}

//获取农历
function getLunarCalendar(year, month, day) {
	var lDate = new Lunar(new Date(year, month, day));
	var y = lDate.year;
	var m = lDate.month;
	var d = lDate.day;

	var lunar = "";
	var paraHoliday = (m > 9 ? m : "0"+m) + "" + (d > 9 ? d : "0" + d);
	
	//农历节日
	if(lunarHoliday.hasOwnProperty(paraHoliday)) {
		return lunarHoliday[paraHoliday];
	}
	
	if (m==12) {
		var theLastDay = lDate.isLeap ? leapDays(y): monthDays(y,m); //农历当月最後一天
		if(theLastDay == d) {
			return "除夕";
		}
	}
	
	//节气
	paraHoliday = ((month+1) > 9 ? (month+1) : "0"+(month+1)) + "" + (day > 9 ? day : "0" + day);
	for(var i = 0; i < sTermDateArr.length; i++) {
		if(paraHoliday == sTermDateArr[i]) {
			return solarTerm[i];
		}
	}
	
	if(d == 1) {
		lunar = nStr1[m] + '月';
	}else {
		lunar = cDay(d);
	}
	return lunar;
}

//用中文显示农历的日期
function cDay(d){
   var s;
   switch (d) {
      case 10:
         s = '初十';
         break;
      case 20:
         s = '二十';
         break;
      case 30:
         s = '三十';
         break;
      default :
         s = nStr2[Math.floor(d/10)];
         s += nStr1[d%10];
   }
   return s;
}

//获取y年的节气
var sTermDateArr = [];
function sTermDate(y) {
	sTermDateArr = [];
	var date = null;
	var stdateStr = "";
	for(var i = 0; i < solarTerm.length; i++) {
		date = new Date( ( 31556925974.7*(y-1900) + sTermInfo[i]*60000) + Date.UTC(1900,0,6,2,5) );
		stdateStr = ((date.getMonth()+1) > 9 ? (date.getMonth()+1) : "0"+(date.getMonth()+1)) + "" + (date.getUTCDate() > 9 ? date.getUTCDate() : "0" + date.getUTCDate());
		sTermDateArr.push(stdateStr);
	}
}
发布了13 篇原创文章 · 获赞 2 · 访问量 491

猜你喜欢

转载自blog.csdn.net/m_crayon/article/details/102979956