JS 精确计算出年龄值

/**
	 * 精确计算根据日期计算年龄 年,月,日
	 * @param {} beginStr:日期格式:yyyy-MM-dd
	 * @param {} endStr:日期格式:yyyy-MM-dd
	 * @author wall
	 * @date 2019-2-21
	 */
    var getAge = function(beginStr,endStr){
		var tmpBirth = {};
		tmpBirth.year = 0;
		tmpBirth.month = 0;
		tmpBirth.day = 0;
	
		if(beginStr == null || beginStr == ''){return;}
		var startDate = new Date(beginStr.replace(/-/g,"/"));
		var endDate = new Date(endStr.replace(/-/g,"/"));
		//var days = endDate.getTime()-startDate.getTime();
		//var day = parseInt(days/(1000*60*60*24));
		
		var startYear = startDate.getFullYear();
		var endYear = endDate.getFullYear();
		var startMonth = startDate.getMonth()+1;
		var endMonth = endDate.getMonth()+1;
		var startDay = startDate.getDate();
		var endDay = endDate.getDate();
		var allDays = 0;
		//准确的每个月天数数组,判断闰年平年。
		var allDayArr = [];
		//当月计算
		if(startYear==endYear&&startMonth==endMonth){
			 tmpBirth.day = endDay-startDay;
			 return tmpBirth;
		}  
		//正常计算
		for(var i=startYear;i<=endYear;i++){
			var currYear = 365
			var yearMonth = 12;
			if(((i%4==0&&i%100!=0)||i%400==0)){
				allDays+=366;
				currYear = 366;
			} 
			var currMonth=1;
			if(i==startYear){
				currMonth = startMonth;
			}
			if(i==endYear){
				yearMonth = endMonth;
			}
			//闰年计算
			for(var m=currMonth;m<=yearMonth;m++){
				var fullDays=30;
				
				 if(m==1||m==3||m==8||m==10||m==12){
					fullDays = 31
				 }else  if(m==2){
					if(((i%4==0&&i%100!=0)||i%400==0)){
						fullDays = 29;
					}else{
						fullDays = 28;
					}
				 }
				var dayObj = {
					fullDays:fullDays,
					currDays:fullDays
				};
				if(m==startMonth&&i==startYear){
					dayObj = {
						fullDays:fullDays,
						currDays:fullDays-startDay
					};
				}else
				if(m==endMonth&&i==endYear){
					dayObj = {
						fullDays:fullDays,
						currDays:endDay
					};
				}
				allDayArr.push(dayObj);
			}
		}

		if(allDayArr.length==1){
			tmpBirth.day = allDayArr[0].currDays;
		}else
		if(allDayArr.length==2){
			var d1 = allDayArr[0].currDays;
			var d2 = allDayArr[1].currDays;
			//月份天数浮动因子决定准确性
			var cfDay = allDayArr[0].fullDays>allDayArr[allDayArr.length-1].fullDays?allDayArr[allDayArr.length-1].fullDays:allDayArr[0].fullDays;
			if((d1+d2)>=cfDay){
				tmpBirth.day = (d1+d2)-cfDay;
				tmpBirth.month +=1;
			}else{
				tmpBirth.day = d1+d2;
			}
		}else{
			var d1 = allDayArr[0].currDays;
			var d2 = allDayArr[allDayArr.length-1].currDays;
			var sumFullDay = 0;
			for(var i=0;iallDayArr[allDayArr.length-1].fullDays?allDayArr[allDayArr.length-1].fullDays:allDayArr[0].fullDays;
			if((d1+d2)>=cfDay){
				tmpBirth.day = (d1+d2)-cfDay;
				tmpBirth.month +=1;
			}else{
				tmpBirth.day = d1+d2;//-(allDayArr[allDayArr.length-1].fullDays-allDayArr[allDayArr.length-2].fullDays);
			}
			tmpBirth.month += allDayArr.length-2;
			
			if(tmpBirth.month>=12){
				tmpBirth.year +=Math.floor(tmpBirth.month/12);
				tmpBirth.month = tmpBirth.month-(tmpBirth.year*12);
			}
		}
		return tmpBirth;
	};
	console.log(getAge("2018-02-01", "2018-03-02"));
    console.log(getAge("2018-02-28", "2018-03-02"));

评论