我应该使用哪种助推器来存储人类年龄

时间:2015-12-16 08:40:41

标签: c++ boost

我必须存储用户的年龄(年,月,日......可能是小时,分钟,秒)。我正在使用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作为一个年龄

2 个答案:

答案 0 :(得分:5)

boost::posix_time::time_duration真的是一种正确地做到这一点的方法。另一种方式(我个人更喜欢)是存储出生日期和“截止日期”两者,并在需要找到该日期的年龄时减去它们。

在任何情况下,您都不需要花费数年的构造函数 - 您可以简单地从今天减去birth_date - 如果您使用date_time对象执行此操作,您将获得time_duration。

答案 1 :(得分: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