【发布时间】:2015-12-16 08:40:41
【问题描述】:
我必须存储用户的年龄(年、月、日......可能是小时、分钟、秒)。我正在使用 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 岁
【问题讨论】:
-
"我不想存储用户的出生日期" 所以计算差异 (current_time - date_of_birth) 为
boost::posix_time::time_duration。我不认为 1400 是医疗项目的真正限制。 -
问题是我实际上并不知道患者的出生日期....医生直接输入年龄作为输入。
-
如果医生输入一个年龄,则计算出生日期。
-
如果您只有医生输入的年龄,只需使用 age_in_years * 365.25 * 24。无论如何,年龄通常会向下舍入到最接近的年份(或一个月对于非常小的孩子),所以你引入的错误(如果有错误的话)是完全无关紧要的。
-
@jpo38 我知道您明确询问过 boost,但我想指出一个用于日期处理的替代库:howardhinnant.github.io/date_v2.html。根据您的需要,这可能是更好的选择,例如当您必须处理时区或闰秒时(然后与howardhinnant.github.io/tz.html 结合使用)。