加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 我应该使用哪种助力等级来存储人类年龄

发布时间:2020-12-16 03:33:33 所属栏目:百科 来源:网络整理
导读:我必须存储用户的年龄(年,月,日……可能是小时,分钟,秒).我正在使用C和提升. 我不确定我应该使用的boost :: posix_time(或boost :: date_time)类. 我尝试过boost :: posix_time :: time_duration,但这并不明显,因为没有构造函数需要一年计算,它只有几个小时,
我必须存储用户的年龄(年,月,日……可能是小时,分钟,秒).我正在使用C和提升.

我不确定我应该使用的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之前存储一年(这会存储一个日期,而不是持续时间).

>我不想存储用户的出生日期,因为我需要在我的程序运行时存储它的年龄(医疗数据).
>我不想存储常规int,因为它不够准确(24岁11个月差不多25个).
>我不想存储一个浮动因为我不想重新发明轮子与浮动到年龄转换我将不得不做…

真的没有课程可以很容易地存储多年,并且可选择一些月份和日期来提升吗?

理想情况下,对于一个30岁半的人,我希望能够创建一个这样的对象:boost :: ……. theAge(30,6,0);然后:

>有一个年龄可以达到年龄的功能:theAge.years()返回30(忽略几个月)
>可能有一个转换浮动,这将给我30.5作为一个年龄

解决方法

boost :: gregorian中确实存在持续时间类型,具体为:

> boost::gregorian::date_duration(又名boost :: gregorian :: days) – 天数
> boost::gregorian::months – 日历月数
> boost :: gregorian :: years – 日历年数
> boost :: gregorian ::周 – 7天的计数

这些对于存储来说是理想的,即存储(年,日)的元组.

请注意,虽然使用特定月份和年份的算法可能会产生意外结果,因为它们提供了一个月末的行为:

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,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;
    }
};

然后,年龄(30).years()== 30和年龄(30,8).getAsFloat()== 30.521902

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读