生日計算年齡

引子

對於一個,極端追求完美的程序員,寫代碼,有時候是很痛苦的。這種痛苦不是怎麼實現一個需求,而是痛苦於選擇,選擇用那種方法實現,才能做到完美。
——今天,天氣悶熱,要下大雨的樣子,股票行情持續走低,大盤接近2700點。

問題描述

最近做項目有一個需求,需要通過出生日期計算年齡。當聽到這個需求,我最直觀的想法就是,出生年份與系統年份做差再加一,得到的年齡(自認爲簡單粗暴,計算準確【按虛歲】)。可是當和其他同事討論的時候,說一般情況按照週歲計算,比較合適。正當和同事討論的時候,忽然另一同事問到,虛歲和週歲的概念是怎麼定義的?我之前也只是模糊的知道,真被同事問起來,我也是懵逼的(生活中處處是學問)。
虛歲是中國傳統的計齡方式,也流行於亞洲東部其它國家,用於計算人出生後正在經歷的年份次序(序數),以剛出生時爲一歲,因爲這是人出生後的第一年,與已經歷過的懷孕近一年無關。按照農曆【摘自百科】

週歲,是國際通用的年齡計算方式。它計算的是出生後已經度過的時間長度(爲基數,故也可以計算尾數,如三歲零兩個月,七歲半等)。按照公曆【摘自百科】。
經過以上對虛歲和週歲概念的理解我們可以得到下表(簡化按照公曆計算):

出生日期 \ 系統當前時間 虛歲 週歲
2017-07-07 \2018-02-02 2 0歲6個月26天
2017-07-07 \2018-08-07 2 1歲1個月
2017-07-07 \2019-07-02 3 1歲11個月26天

由於我們項目中的需求,對年齡爲整數顯示,沒有月數和日數,最後討論,用週歲顯示,但只顯示幾週歲,月數和日數捨去,零週歲顯示一歲。
實現代碼如下:

int GetAge(STPerItem *st, CDeviceInfo *m_Device) {
    int nAge = m_Device->nSysYear - st->nYear;
    if (nAge <= 0) {
        nAge = 1;
    } else {
        if (m_Device->nMonth < st->nMonth) {
            nAge -= 1;
        } else if (m_Device->nMonth == st->nMonth) {
            if (m_Device->nDay < st->nDay) {
                nAge -= 1;
            }
        }
    }
    return nAge;
}

總結:

解決問題之前,一定要搞懂所有相關概念(切記概念模糊),只有做到胸中有數,才能完美解決問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章