Javascript农历与公历相互转换的简单实例

如下所示:

rush:js;"> /**用法 * Lunar.toSolar(2016,6,3); 农历转化公历 * Lunar.toLunar(2016,7,6); 公历转化农历 */ var Lunar = { MIN_YEAR : 1891,MAX_YEAR : 2100,lunarInfo : [ [0,2,9,21936],[6,1,30,9656],[0,17,9584],21168],[5,26,43344],13,59728],27296],[3,22,44368],10,43856],[8,19304],19,19168],8,42352],29,21096],16,53856],4,55632],[4,25,27304],22176],39632],[2,19176],42200],18,42192],53840],54568],14,46400],3,54944],23,38608],11,38320],[7,18872],20,18800],42160],28,45656],27216],5,27968],24,44456],11104],38256],18808],25776],54432],59984],27976],23248],37744],37600],31,51560],51536],27,55888],15,46416],43736],9680],37584],51544],46248],27808],21928],19872],42416],21176],12,19296],21088],21,59696],23208],19152],53864],46752],18864],42168],[10,44448],43872],27432],23232],37736],51552],54440],46240],[9,19360],43312],29864],19880],42208],54576],23200],27472],[11,53848],54560],55968],46496],22224],19160],43600],46376],27936],27424],43744],51568],42704],21224],21200],43352],21920],42448],43320],26928],29336],21104],42216],53584],55592],54560] ],//是否闰年 isLeapYear : function(year) { return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)); },//天干地支年 lunarYear : function(year) { var gan = ['庚','辛','壬','癸','甲','乙','丙','丁','戊','己'],zhi = ['申','酉','戌','亥','子','丑','寅','卯','辰','巳','午','未'],str = year.toString().split(""); return gan[str[3]] + zhi[year % 12]; },//生肖年 zodiacYear : function(year) { var zodiac = ['猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马','羊']; return zodiac[year % 12]; },//公历月份天数 //@param year 阳历-年 //@param month 阳历-月 solarMonthDays : function(year,month) { var FebDays = this.isLeapYear(year) ? 29 : 28; var monthHash = ['',FebDays,31]; return monthHash[month]; },//农历月份天数 lunarMonthDays : function(year,month) { var monthData = this.lunarMonths(year); return monthData[month - 1]; },//农历月份天数数组 lunarMonths : function(year) { var yearData = this.lunarInfo[year - this.MIN_YEAR]; var leapMonth = yearData[0]; var bit = (+yearData[3]).toString(2); var months = []; for (var i = 0; i < bit.length; i++) { months[i] = bit.substr(i,1); }
for (var k = 0,len = 16 - months.length; k < len; k++) {
  months.unshift('0');
}

months = months.slice(0,(leapMonth == 0 ? 12 : 13));
for (var i = 0; i < months.length; i++) {
  months[i] = +months[i] + 29;
}
return months;

},//农历每年的天数
//@param year 农历年份
lunarYearDays : function(year) {
var monthArray = this.lunarYearMonths(year);
var len = monthArray.length;
return (monthArray[len-1] == 0 ? monthArray[len-2] : monthArray[len-1]);
},//
lunarYearMonths : function(year) {
var monthData = this.lunarMonths(year);
var res = [];
var temp = 0;
var yearData = this.lunarInfo[year - this.MIN_YEAR];
var len = (yearData[0] == 0 ? 12 : 13);
for (var i = 0; i < len; i++) {
temp = 0;
for (j = 0; j <= i; j++) {
temp += monthData[j];
}
res.push(temp);
}
return res;
},//获取闰月
//@param year 农历年份
leapMonth : function(year){
var yearData = this.lunarInfo[year - this.MIN_YEAR];
return yearData[0];
},//计算农历日期与正月初一相隔的天数
betweenLunarDays : function(year,month,day) {
var yearMonth = this.lunarMonths(year);
var res = 0;
for (var i = 1; i < month; i++) {
res += yearMonth[i-1];
}
res += day - 1;
return res;
},//计算2个阳历日期之间的天数
//@param year 阳历年
//@param month
//@param day
//@param l_month 阴历正月对应的阳历月份
//@param l_day 阴历初一对应的阳历天
betweenSolarDays : function(year,day,l_month,l_day) {
var time1 = new Date(year +"-"+ month +"-"+ day).getTime(),time2 = new Date(year +"-"+ l_month +"-"+ l_day).getTime();
return Math.ceil((time1-time2)/24/3600/1000);
},//根据距离正月初一的天数计算阴历日期
//@param year 阳历年
//@param between 天数
lunarByBetween : function(year,between) {
var lunarArray = [],yearMonth = [],t = 0,e = 0,leapMonth = 0,m = '';
if (between == 0) {
t = 1;
e = 1;
m = '正月';
} else {
year = between > 0 ? year : (year - 1);
yearMonth = this.lunarYearMonths(year);
leapMonth = this.leapMonth(year);
between = between > 0 ? between : (this.lunarYearDays(year) + between);
for (var i = 0; i < 13; i++) {
if (between == yearMonth[i]) {
t = i + 2;
e = 1;
break;
} else if (between < yearMonth[i]) {
t = i + 1;
e = between - ((yearMonth[i-1]) ? yearMonth[i-1] : 0) + 1;
break;
}
}

  m = (leapMonth != 0 && t == leapMonth + 1)
  ? ('闰'. this.chi<a href="https://www.jb51.cc/tag/nes/" target="_blank" class="keywords">nes</a>eMonth(t-1))
  : this.chi<a href="https://www.jb51.cc/tag/nes/" target="_blank" class="keywords">nes</a>eMonth(((leapMonth != 0 && leapMonth + 1 < t) ? (t - 1) : t));
}
lun<a href="https://www.jb51.cc/tag/ara/" target="_blank" class="keywords">ara</a>rray.push(year,t,e); //年 月 日
lun<a href="https://www.jb51.cc/tag/ara/" target="_blank" class="keywords">ara</a>rray.push(this.lunarYear(year),this.zodiacYear(year),m,this.chi<a href="https://www.jb51.cc/tag/nes/" target="_blank" class="keywords">nes</a>eNumber(e)); //天干地支年 生肖年 月份 日
lun<a href="https://www.jb51.cc/tag/ara/" target="_blank" class="keywords">ara</a>rray.push(leapMonth); //闰几月
return lun<a href="https://www.jb51.cc/tag/ara/" target="_blank" class="keywords">ara</a>rray;

},//中文月份
chineseMonth : function(month) {
var monthHash = ['','正月','二月','三月','四月','五月','六月','七月','八月','九月','十月','冬月','腊月'];
return monthHash[month];
},//中文日期
chineseNumber : function(num) {
var dateHash = ['','一','二','三','四','五','六','七','八','九','十'];
if (num <= 10) {
res = '初'+ dateHash[num];
} else if (num > 10 && num < 20) {
res = '十'+ dateHash[num-10];
} else if (num == 20) {
res = "二十";
} else if (num > 20 && num < 30) {
res = "廿"+ dateHash[num-20];
} else if (num == 30) {
res = "三十";
}
return res;
},//转换农历
toLunar : function(year,day) {
var yearData = this.lunarInfo[year - this.MIN_YEAR];
if (year == this.MIN_YEAR && month <= 2 && day <= 9) {
return [1891,'辛卯','初一'];
}
return this.lunarByBetween(year,this.betweenSolarDays(year,yearData[1],yearData[2]));
},//转换公历
//@param year 阴历-年
//@param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月
//@param date 阴历-日
toSolar : function(year,day) {
var yearData = this.lunarInfo[year - this.MIN_YEAR];
var between = this.betweenLunarDays(year,day);
var ms = new Date(year +"-" + yearData[1] +"-"+ yearData[2]).getTime();
var s = ms + between 24 60 60 1000;
var d = new Date();
d.setTime(s);
year = d.getFullYear();
month = d.getMonth() + 1;
day = d.getDate();
return [year,day];
}
};

以上就是小编为大家带来的Javascript农历与公历相互转换的简单实例全部内容了,希望大家多多支持编程之家~

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...