javascript 日期 新历 农历 生肖 农历节庆 总结

因为最近项目需要用js做一个日历控件,所以到网上去搜了一些算法,自己根据这些算法也做了一些优化,今天总结一下,以便日后使用,感谢原作者


//新历日期
var today = new Date();
//年
var year = today.getFullYear()<100 ? today.getFullYear()+1900:today.getFullYear()
//当前月
var month = today.getMonth + 1;
//日
var day = today.getDate();


//DateGL = new Date();

//得到农历 年
function CnYearofDate(DateGL){
	var YYYY=DateGL.getFullYear();
	var MM=DateGL.getMonth()+1;
	var CnMM=parseInt(Math.abs(CnDateofDate(DateGL))/100);
	if(YYYY<100) YYYY+=1900;
	if(CnMM>MM) YYYY--;
	YYYY-=1864;
	return CnEra(YYYY)+"年";
}

function CnEra(YYYY){
	var Tiangan=new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
	//var Dizhi=new Array("子(鼠)","丑(牛)","寅(虎)","卯(兔)","辰(龙)","巳(蛇)",
	//"午(马)","未(羊)","申(猴)","酉(鸡)","戌(狗)","亥(猪)");
	var Dizhi=new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
	return Tiangan[YYYY%10]+Dizhi[YYYY%12];
}

//得到农历 月
function CnMonthofDate(DateGL){
	var CnMonthStr=new Array("零","正","二","三","四","五","六","七","八","九","十","冬","腊");
	var Month;
	Month = parseInt(CnDateofDate(DateGL)/100);
	
	if (Month < 0){return "闰" + CnMonthStr[-Month] + "月";}
	else{return CnMonthStr[Month] + "月";}
}

//得到农历 日
function CnDayofDate(DateGL){
	var CnDayStr=new Array("零",
	"初一", "初二", "初三", "初四", "初五",
	"初六", "初七", "初八", "初九", "初十",
	"十一", "十二", "十三", "十四", "十五",
	"十六", "十七", "十八", "十九", "二十",
	"廿一", "廿二", "廿三", "廿四", "廿五",
	"廿六", "廿七", "廿八", "廿九", "三十");
	var Day;
	Day = (Math.abs(CnDateofDate(DateGL)))%100;
	return CnDayStr[Day];
}

//得到农历节庆
function SolarTerm(DateGL){
	var SolarTermStr=new Array(
		"小寒","大寒","立春","雨水","惊蛰","春分",
		"清明","谷雨","立夏","小满","芒种","夏至",
		"小暑","大暑","立秋","处暑","白露","秋分",
		"寒露","霜降","立冬","小雪","大雪","冬至");
	var DifferenceInMonth=new Array(
		1272060,1275495,1281180,1289445,1299225,1310355,
		1321560,1333035,1342770,1350855,1356420,1359045,
		1358580,1355055,1348695,1340040,1329630,1318455,
		1306935,1297380,1286865,1277730,1274550,1271556);
	var DifferenceInYear=31556926;
	var BeginTime=new Date(1901/1/1);
	BeginTime.setTime(947120460000);
	for(;DateGL.getFullYear()<BeginTime.getFullYear();){
		BeginTime.setTime(BeginTime.getTime()-DifferenceInYear*1000);
	}
	for(;DateGL.getFullYear()>BeginTime.getFullYear();){
		BeginTime.setTime(BeginTime.getTime()+DifferenceInYear*1000);
	}
	for(var M=0;DateGL.getMonth()>BeginTime.getMonth();M++){
		BeginTime.setTime(BeginTime.getTime()+DifferenceInMonth[M]*1000);
	}
	if(DateGL.getDate()>BeginTime.getDate()){
		BeginTime.setTime(BeginTime.getTime()+DifferenceInMonth[M]*1000);
		M++;
	}
	if(DateGL.getDate()>BeginTime.getDate()){
		BeginTime.setTime(BeginTime.getTime()+DifferenceInMonth[M]*1000);
		M==23?M=0:M++;
	}
	var JQ='';
	if(DateGL.getDate()==BeginTime.getDate()){
		JQ= SolarTermStr[M] + "";
	}
	return JQ;
}

function CnDateofDate(DateGL){
	var CnData=new Array(
		0x16,0x2a,0xda,0x00,0x83,0x49,0xb6,0x05,0x0e,0x64,0xbb,0x00,0x19,0xb2,0x5b,0x00,
		0x87,0x6a,0x57,0x04,0x12,0x75,0x2b,0x00,0x1d,0xb6,0x95,0x00,0x8a,0xad,0x55,0x02,
		0x15,0x55,0xaa,0x00,0x82,0x55,0x6c,0x07,0x0d,0xc9,0x76,0x00,0x17,0x64,0xb7,0x00,
		0x86,0xe4,0xae,0x05,0x11,0xea,0x56,0x00,0x1b,0x6d,0x2a,0x00,0x88,0x5a,0xaa,0x04,
		0x14,0xad,0x55,0x00,0x81,0xaa,0xd5,0x09,0x0b,0x52,0xea,0x00,0x16,0xa9,0x6d,0x00,
		0x84,0xa9,0x5d,0x06,0x0f,0xd4,0xae,0x00,0x1a,0xea,0x4d,0x00,0x87,0xba,0x55,0x04
	);
	var CnMonth=new Array();
	var CnMonthDays=new Array();
	var CnBeginDay;
	var LeapMonth;
	var Bytes=new Array();
	var I;
	var CnMonthData;
	var DaysCount;
	var CnDaysCount;
	var ResultMonth;
	var ResultDay;
	var yyyy = DateGL.getFullYear();
	var mm=DateGL.getMonth()+1;
	var dd=DateGL.getDate();
	if(yyyy<100) yyyy+=1900;
	if ((yyyy < 1997) || (yyyy > 2020)){
		return 0;
	}
	Bytes[0] = CnData[(yyyy - 1997) * 4];
	Bytes[1] = CnData[(yyyy - 1997) * 4 + 1];
	Bytes[2] = CnData[(yyyy - 1997) * 4 + 2];
	Bytes[3] = CnData[(yyyy - 1997) * 4 + 3];
	if ((Bytes[0] & 0x80) != 0) {CnMonth[0] = 12;}
	else {CnMonth[0] = 11;}
	CnBeginDay = (Bytes[0] & 0x7f);
	CnMonthData = Bytes[1];
	CnMonthData = CnMonthData << 8;
	CnMonthData = CnMonthData | Bytes[2];
	LeapMonth = Bytes[3];
	for (I=15;I>=0;I--){
	CnMonthDays[15 - I] = 29;
	if (((1 << I) & CnMonthData) != 0 ){
	CnMonthDays[15 - I]++;}
	if (CnMonth[15 - I] == LeapMonth ){
	CnMonth[15 - I + 1] = - LeapMonth;}
	else{
	if (CnMonth[15 - I] < 0 ){CnMonth[15 - I + 1] = - CnMonth[15 - I] + 1;}
	else {CnMonth[15 - I + 1] = CnMonth[15 - I] + 1;}
	if (CnMonth[15 - I + 1] > 12 ){ CnMonth[15 - I + 1] = 1;}
	}
	}
	DaysCount = DaysNumberofDate(DateGL) - 1;
	if (DaysCount <= (CnMonthDays[0] - CnBeginDay)){
	if ((yyyy > 1901) && (CnDateofDate(new Date((yyyy - 1)+"/12/31")) < 0)){
	ResultMonth = - CnMonth[0];}
	else {ResultMonth = CnMonth[0];}
	ResultDay = CnBeginDay + DaysCount;
	}
	else{
	CnDaysCount = CnMonthDays[0] - CnBeginDay;
	I = 1;
	while ((CnDaysCount < DaysCount) && (CnDaysCount + CnMonthDays[I] < DaysCount)){
	CnDaysCount+= CnMonthDays[I];
	I++;
	}
	ResultMonth = CnMonth[I];
	ResultDay = DaysCount - CnDaysCount;
	}
	if (ResultMonth > 0){
	return ResultMonth * 100 + ResultDay;}
	else{return ResultMonth * 100 - ResultDay;}
}

//生肖
//yyyy 年份
function getShengxiao(yyyy){
  var arr=['猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马','羊'];
  return /^\d{4}$/.test(yyyy)?arr[yyyy%12]:null;
} 

目前就总结了这一部份,有空再补充,再次感谢原作者
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章