2014-10-18 51 views
4

從升壓文檔上類boost ::格里曆日期::的here整數表示:獲得升壓::格里曆日期::

「內部升壓::公曆::日期存儲爲一個32位整數鍵入「

現在,這將是一個很好的緊湊方式,比如說將這個日期存儲在一個文件中。但文檔沒有指定任何方式從對象中提取它。

問題是:有沒有辦法獲得這個整數表示,以便稍後構造同一個類的另一個相等的對象?

回答

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

當然你也可以使用升壓序列化的序列化,它會用最緊湊的表示。見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"; 
} 
0

甲吱吱特技是做

TM to_tm(日期)

日期date_from_tm(TM datetm)

和從變換TM /與

到time_t的

struct tm * localtime(const time_t * timep); 的time_t mktime(結構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); 
+0

我有一種感覺,這忽略了答案的目標。這不是關於「我可以做一個32位表示」。這是關於「我如何獲得Boost的格里高利日期類型的位表示 – sehe 2014-10-18 18:48:21

+0

」當然,你的問題當然是對的,但是在最後一句(s |)中,他表示如果有一個簡單的32位代表存儲和重建。我認爲這可能會有所幫助。 – Oncaphillis 2014-10-18 18:54:15