ICode9

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

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

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

标签: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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

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

ICode9版权所有