如何計算出生日期到截止時間的年齡


  首先呢,我們來詳細描述下我們的規則:

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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM