從升壓文檔上類boost ::格里曆日期::的here整數表示:獲得升壓::格里曆日期::
「內部升壓::公曆::日期存儲爲一個32位整數鍵入「
現在,這將是一個很好的緊湊方式,比如說將這個日期存儲在一個文件中。但文檔沒有指定任何方式從對象中提取它。
問題是:有沒有辦法獲得這個整數表示,以便稍後構造同一個類的另一個相等的對象?
從升壓文檔上類boost ::格里曆日期::的here整數表示:獲得升壓::格里曆日期::
「內部升壓::公曆::日期存儲爲一個32位整數鍵入「
現在,這將是一個很好的緊湊方式,比如說將這個日期存儲在一個文件中。但文檔沒有指定任何方式從對象中提取它。
問題是:有沒有辦法獲得這個整數表示,以便稍後構造同一個類的另一個相等的對象?
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";
}
甲吱吱特技是做
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);
我有一種感覺,這忽略了答案的目標。這不是關於「我可以做一個32位表示」。這是關於「我如何獲得Boost的格里高利日期類型的位表示 – sehe 2014-10-18 18:48:21
」當然,你的問題當然是對的,但是在最後一句(s |)中,他表示如果有一個簡單的32位代表存儲和重建。我認爲這可能會有所幫助。 – Oncaphillis 2014-10-18 18:54:15