当前位置 博文首页 > 文章内容

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

    作者: 栏目:未分类 时间:2020-07-03 18:00:49

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



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

    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)