如何计算出生日期到截止时间的年龄
作者:互联网
首先呢,我们来详细描述下我们的规则:
1、首先传入两个时间,一个birthTime,一个time,是分别代表出生日期和截止日期的时间戳。
2、如果这个人的年龄小于一个月,那么展示他的年龄为XX天,如18天、5天等。
3、如果这个人的年龄大于等于一个月,且小于3年的话,那么他的年龄展示为XX个月XX天,如5个月18天、20个月5天等。
3、如果这个人的年龄大于等于3的话,那么就展示XX岁,如20岁、58岁、4岁等。
4、每个月份的天数是不固定的,所以我们不能单纯的以30天来作为一个月来计算年龄。
接下来开始我们的思路分析:
其实想问大家,看到这种问题大家有没有觉得和我们做过的一种数学题很相似,就比如说,我们要算一个20岁的人活到100的时候总共活了多少年的话,我们是不是直接用100-20就等于80了,其实类似的,我们可以把出生时间和截止时间的年月日,分别取出来,然后拿他们做一个减法就可以了,所以首先,我们需要一个根据时间戳获取年月日的方法,如下:
function getYearMonthDayByTimestamp(timestamp){ let date = new Date(timestamp); let _Y = date.getFullYear(); let _M = date.getMonth()+1; let _D = date.getDate(); return [_Y, _M, _D] }
然后我们就获取到了两个年月日的列表,拿他们做减法(截止时间减去出生时间),然后分别得出年的差值yearAge,月的差值monthAge,日的差值dayAge,然后我们就要判断:
1、如果dayAge小于0的话,那么就说明,现在的日不够减,那么我们就需要和月份借一个月过来,但是这个每个月的天数都是不一样的,所以我们就需要动态获取截止时间time所在的上一个月份的天数,这里我们用到的是moment.js,moment的下载安装及内置API点这里to MomentJs,这里大家注意,一般容易出问题的就是这个天数算不明白,所以这里要仔细检查。
2、判断完日的差值之后,我们来判断月的差值,这个其实相对简单一些,因为一年固定只有12个月,所以如果monthAge小于0的话,那么我们就要借上一年,然后再计算剩几个月了。
3、如果yearAge小于0的话,那就说明很可能这个人还没有满一岁,就不用多加处理了。当然如果大家发现yearAge、monthAge、dayAge都小于0的话,如果不是故意捣蛋的话,那就是大家把两个时间传反了。
好的,接下来我们上这块的逻辑代码:
function getDistanceDate(birthTime, time){ let birthDates = this.getYearMonthDayByTimestamp(birthTime); let timeDates = this.getYearMonthDayByTimestamp(time); let yearAge:number = timeDates[0]-birthDates[0] let monthAge:number = timeDates[1]-birthDates[1] let dayAge:number = timeDates[2]-birthDates[2] if(dayAge < 0){ monthAge --;
// 下面这句就是先获取截止时间time的上一个月的总天数 let lastMonthDays = new Date(moment(time).subtract(1, 'months').endOf('month').valueOf()).getDate() dayAge += lastMonthDays } if(monthAge < 0){ yearAge --; monthAge = (monthAge + 12) % 12 } return [yearAge, monthAge, dayAge] }
好的,其实到这里我们的逻辑计算部分就算结束了,接下来就是封装一个方法来根据不同的规则去展示不同的年龄了。代码如下:
// 调用上面的计算规则,输出符合我们需求的年龄
function getAgeInfo(birthTime, time){ let distanceDate = this.getDistanceDate(birthTime, time) let distanceY = distanceDate[0]; let distanceM = distanceDate[1]; let distanceD = distanceDate[2]; if(distanceY >= 3) { return distanceY + '岁' } if(distanceY <= 0 && distanceM <= 0) { return distanceD + '天' } return 12 * distanceY + distanceM+ '个月' + (distanceD>0 ? distanceD+'天' : '') }
然后我们在调用的时候,直接去调用我们封装好的getAgeInfo()这个方法就可以了,调用方法如下:
// 注意,birthDay与endDay都是标准日期格式,如'2020-07-02 17:46:23'这种,或者大家直接把时间戳传到方法里面就可以了,注意顺序哟!
let birthTime = new Date(birthDay).getTime(); let nowTime = new Date(endDay).getTime() this.getAgeInfo(birthTime, endTime)
好了,以上就是我们关于年龄计算问题的设计思路以及代码实现了,完整的代码如下,大家可以根据自己的需求进行修改,欢迎指正!
function getYearMonthDayByTimestamp(timestamp){ let date = new Date(timestamp); let _Y = date.getFullYear(); let _M = date.getMonth()+1; let _D = date.getDate(); return [_Y, _M, _D] }
function getDistanceDate(birthTime, time){ let birthDates = this.getYearMonthDayByTimestamp(birthTime); let timeDates = this.getYearMonthDayByTimestamp(time); let yearAge:number = timeDates[0]-birthDates[0] let monthAge:number = timeDates[1]-birthDates[1] let dayAge:number = timeDates[2]-birthDates[2] if(dayAge < 0){ monthAge --; // 下面这句就是先获取截止时间time的上一个月的总天数 let lastMonthDays = new Date(moment(time).subtract(1, 'months').endOf('month').valueOf()).getDate() dayAge += lastMonthDays } if(monthAge < 0){ yearAge --; monthAge = (monthAge + 12) % 12 } return [yearAge, monthAge, dayAge] }
// 调用上面的计算规则,输出符合我们需求的年龄 function getAgeInfo(birthTime, time){ let distanceDate = this.getDistanceDate(birthTime, time) let distanceY = distanceDate[0]; let distanceM = distanceDate[1]; let distanceD = distanceDate[2]; if(distanceY >= 3) { return distanceY + '岁' } if(distanceY <= 0 && distanceM <= 0) { return distanceD + '天' } return 12 * distanceY + distanceM+ '个月' + (distanceD>0 ? distanceD+'天' : '') }
// 注意,birthDay与endDay都是标准日期格式,如'2020-07-02 17:46:23'这种,或者大家直接把时间戳传到方法里面就可以了,注意顺序哟! let birthTime = new Date(birthDay).getTime(); let nowTime = new Date(endDay).getTime() this.getAgeInfo(birthTime, endTime)
标签:birthTime,dayAge,monthAge,yearAge,let,time,出生日期,年龄,截止 来源: https://www.cnblogs.com/inkwind/p/13231789.html