将int64_t转换为time_duration

tib*_*bur 6 c++ time boost

我想boost::posix_time::ptime通过网络传输一个boost::int64_t.根据将boost :: posix_time :: ptime转换为__int64的方法,我可以轻松定义自己的纪元,并且仅time_duration将该参考纪元作为64位整数传输.但是如何转换回来ptime呢?

#include <iostream>
#include <cassert>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/gregorian/greg_month.hpp>

using namespace std;

using boost::posix_time::ptime;
using boost::posix_time::time_duration;
using boost::gregorian::date;

int main(int argc, char ** argv){
    ptime t = boost::posix_time::microsec_clock::local_time();

    // convert to int64_t
    ptime myEpoch(date(1970,boost::gregorian::Jan,1));
    time_duration myTimeFromEpoch = t - myEpoch;
    boost::int64_t myTimeAsInt = myTimeFromEpoch.ticks();

    // convert back to ptime
    ptime test = myEpoch + time_duration(myTimeAsInt);

    assert(test == t);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为将time_durationtick计数作为参数的构造函数是私有的.我也对ptime通过简单数据类型简单地传输它的任何其他方式感兴趣.

tib*_*bur 5

具有毫秒分辨率的工作解决方案:

int main(int argc, char ** argv){
    ptime t = boost::posix_time::microsec_clock::local_time();

    // convert to int64_t
    ptime myEpoch(date(1970,boost::gregorian::Jan,1));
    time_duration myTimeFromEpoch = t - myEpoch;
    boost::int64_t myTimeAsInt = myTimeFromEpoch.total_milliseconds();

    // convert back to ptime
    ptime test = myEpoch + boost::posix_time::milliseconds(myTimeAsInt);

    cout << test << endl;
    cout << t << endl;

    time_duration diff = test - t;

    assert(diff.total_milliseconds()==0);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

谢谢12a6.

  • 我不认为这个答案适用于32位系统.我在使用1901-01-01 00:00:00的纪元的32位系统上尝试了这个,但它不起作用.很明显它适用于你,但是`milliseconds()`的参数是long类型,而`total_milliseconds()`的返回类型也是long,所以你不会丢失从int64_t到long的隐式转换中的任何内容. (3认同)