/**
* 精确计算根据日期计算年龄 年,月,日
* @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"));