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);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值