ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何计算出生日期到截止时间的年龄

2020-07-03 18:02:37  阅读:105  来源: 互联网

标签:birthTime dayAge monthAge yearAge let time 出生日期 年龄 截止


  首先呢,我们来详细描述下我们的规则:

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

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有