获取boost :: gregorian :: date的整数表示

时间:2014-10-18 15:44:26

标签: c++ date boost

来自类boost :: gregorian :: date here的增强文档:

  

"内部boost :: gregorian :: date存储为32位整数类型"

现在这将是一个很好的,紧凑的方式,比如说,将这个日期存储在一个文件中。但是文档没有指定从对象中提取它的任何方法。

问题是:有没有办法获得这个整数表示,以后再构造同一个类的另一个相等的对象?

2 个答案:

答案 0 :(得分:4)

day_number()成员函数返回此值。

boost::gregorian::date d(2014, 10, 18);
uint32_t number = d.day_number();

可以实现逆转:

gregorian_calendar::ymd_type ymd = gregorian_calendar::from_day_number(dn);
d = { ymd.year, ymd.month, ymd.day };

您当然可以使用Boost Serialization进行序列化,它将使用最紧凑的表示。见http://www.boost.org/doc/libs/1_56_0/doc/html/date_time/serialization.html

查看完整演示: Live On Coliru

#include <boost/date_time/gregorian/greg_date.hpp>
#include <boost/date_time/gregorian/gregorian_io.hpp>
#include <iostream>

using namespace boost::gregorian;

int main()
{
    date d(2014, 10, 17);
    static_assert(sizeof(d) == sizeof(int32_t), "truth");

    std::cout << d << "\n";

    uint32_t dn = d.day_number();
    dn += 1;

    gregorian_calendar::ymd_type ymd = gregorian_calendar::from_day_number(dn);
    d = { ymd.year, ymd.month, ymd.day };
    std::cout << d << "\n";
}

答案 1 :(得分:-1)

一个蠢事就是做

tm to_tm(日期)

日期date_from_tm(tm datetm)

并使用

将tm从/转换为time_t

struct tm * localtime(const time_t * timep);  time_t mktime(struct tm * tm)

然而,

time_t通常是64位,旧的32位将在2038年失败。

将日期编码/解码为

并不复杂
int32_t  ye = d.year(); 
uint32_t mo = d.month(); 
uint32_t da = d.day();

// encode
int32_t l = ((ye << 9) & 0xfffffe00) | ((mo << 5) & 0x0000001d0) | (da & 0x0000001f);

// decode 
ye = (l  >> 9); 
mo = ((l >> 5) & 0x0000000f); 
da = (l        & 0x0000001f);