2015-12-16 50 views
6

我必須存儲用戶的年齡(年,月,日......可能是幾小時,幾分鐘,幾秒)。我正在使用C++和boost。我應該使用哪種增強類來存儲人類年齡

我不確定我應該用什麼類的boost::posix_time(或boost::date_time)。

我試過boost::posix_time::time_duration,但因爲沒有構造以一年計,這只是時間不是很明顯,所以我所做的:

boost::posix_time::time_duration age = boost::posix_time::hours(24*365*ageInYears); 

但我不知道這是因爲所有年份的好策略沒有365天;-)

我也試過boost::gregorian::date,但這很棘手,因爲這個不允許在1400之前存儲year(這存儲日期,而不是持續時間)。

  • 我不想存儲用戶的出生日期,因爲我需要在程序運行時存儲它的年齡(醫療數據)。
  • 我不想存儲常規的int,因爲它不夠準確(24歲+ 11個月差不多25)。
  • 我不想存儲float,因爲我不希望重塑與浮動年齡轉換輪我會做...

難道真的沒有階級使其易於存儲幾年,可選地增加幾個月和幾天?

理想的情況下,爲30歲半的一個傢伙,我希望能夠建立這樣一個對象:boost::....... theAge(30, 6, 0);然後:

  • 有一個函數來獲取年齡歲: theAge.years()返回30(忽略月)
  • 可能有一個轉換浮動,這將使我爲30.5年齡
+0

「我不希望存儲出生日期用戶」所以,計算差值(CURRENT_TIME - DATE_OF_BIRTH )作爲'boost :: posix_time :: time_duration'。我不認爲1400是醫療計劃的真正限制。 –

+0

問題是我實際上並不知道患者的出生日期....醫生直接輸入年齡作爲輸入。 – jpo38

+0

如果醫生進入一個年齡段,則從中計算一個DOB。 –

回答

4

確實存在boost::gregorian期限類型,具體包括:

這些將是存儲的理想選擇,即存儲(年,月,日)的元組。

注意,雖然使用特別monthsyears算術可以有意想不到的效果,因爲它們提供鎖定到結束一個月行爲:

months single(1); // 1 month duration 
date(2005,Feb,28) + single; // => 2005-Mar-31 

從OP所有者編輯:有實際一個現有的boost結構來存儲年/月/日對象(boost::date_time::date_time::year_month_day_base)。

這裏是一個完美的實現接聽OP:

class age : public date_time::year_month_day_base<years, months, days> 
{ 
    typedef date_time::year_month_day_base<years, months, days> baseClass; 
public: 
    age(int yearsCount, int monthsCount = 0, int daysCount = 0) : 
     baseClass(boost::gregorian::years(yearsCount), 
        boost::gregorian::months(monthsCount), 
        boost::gregorian::days(daysCount)) 
    { 
    } 

    inline int years() const { return year.number_of_years().as_number(); } 
    inline int months() const { return month.number_of_months().as_number(); } 
    inline int days() const { return day.days(); } 

    float getAsFloat() const 
    { 
     float age = static_cast<float>(years()); 
     age += months()/12.0f; 
     age += days()/365.25f; 
     return age; 
    } 
}; 

然後,age(30).years() == 30age(30,6,8).getAsFloat() == 30.521902

+0

不幸的是,這與'boost :: gregorian :: date'具有相同的限制,因爲'boost :: gregorian :: years'拒絕了任何值<1400 ..... – jpo38

+0

@ jpo38您究竟如何使用'提振::陽曆:: years'?它應該工作得很好:http://coliru.stacked-crooked.com/a/478a0aa295da1c5a – ecatmur

+0

我試過'boost :: gregorian :: greg_year_month_day patientAge(30,0,0);'這個斷言因爲年份必須> 1400和也因爲月份必須是1..12,日期必須是1..31。所以我應該使用'boost :: gregorian :: greg_year_month_day patientAge(1430,1,1);'來編碼一個30歲的年齡....不是很方便。 – jpo38

5

boost::posix_time::time_duration真的是正確做到這一點的方法之一。另一種方式(我個人更喜歡)是將出生日期和「過期日期」兩者都存儲起來,並在需要查找當日年齡時扣除它們。

在任何情況下,您都不需要構造函數需要多少年 - 您可以簡單地從今天減去birth_date - 如果使用date_time對象執行此操作,則會得到time_duration。

相關問題