boost :: date_time和std :: chrono之间的互操作性

HC4*_*ica 24 c++ datetime boost c++11 c++-chrono

boost :: date_time和std :: chrono的互操作性如何?

例如,有没有办法在boost :: posix_time :: ptime和std :: chrono :: time_point之间进行转换?

我尝试搜索有关此类转换的文档,但找不到任何内容.

HC4*_*ica 14

我在boost commits邮件列表中找到了这个:http://lists.boost.org/boost-commit/2009/04/15209.php

以下是相关功能:

template < class Clock, class Duration> 
struct convert_to<posix_time::ptime, chrono::time_point<Clock, Duration> > { 
    inline static posix_time::ptime apply(const chrono::time_point<Clock, Duration>& from) 
    { 
        typedef chrono::time_point<Clock, Duration> time_point_t; 
        typedef chrono::nanoseconds duration_t; 
        typedef duration_t::rep rep_t; 
        rep_t d = chrono::duration_cast<duration_t>(from.time_since_epoch()).count(); 
        rep_t sec = d/1000000000; 
        rep_t nsec = d%1000000000; 
        return boost::posix_time::from_time_t(0)+ 
        boost::posix_time::seconds(static_cast<long>(sec))+ 
        #ifdef BOOST_DATE_TIME_HAS_NANOSECONDS 
        boost::posix_time::nanoseconds(nsec); 
        #else 
        boost::posix_time::microseconds((nsec+500)/1000); 
        #endif 
    } 
}; 

template < class Clock, class Duration> 
struct convert_to<chrono::time_point<Clock, Duration>, posix_time::ptime> { 
    inline static chrono::time_point<Clock, Duration> apply(const posix_time::ptime& from) 
    { 
        boost::posix_time::time_duration const time_since_epoch=from-boost::posix_time::from_time_t(0); 
        chrono::time_point<Clock, Duration> t=chrono::system_clock::from_time_t(time_since_epoch.total_seconds()); 
        long nsec=time_since_epoch.fractional_seconds()*(1000000000/time_since_epoch.ticks_per_second()); 
        return t+chrono::nanoseconds(nsec); 

    } 
}; 
Run Code Online (Sandbox Code Playgroud)

我不确定他们何时会成为助推器的一部分.他们现在似乎没有加速行李箱......

  • 很好找.这些函数似乎假设Clock的纪元与ptime的相同:New Years,1970.如果这个假设是真的,那么这些函数是有效的.如果不是,则这些函数是静默运行时错误. (10认同)
  • 我相信你可以非常接近.我首先要制作一个自定义的chrono :: clock(不需要是命名空间chrono),它有一个New Years,1970年代.如上所述,在ptime和你的新Clock之间进行转换.然后,您可以通过从每个时钟(一个接一个)获取now()来近似地在两个计时时钟之间进行转换.减去每个time_point的time_since_epoch()以获得一个持续时间,该持续时间是两个计时时钟的历元之间的差异.您可以添加/减去该差异以在两个计时time_points之间进行转换. (4认同)
  • 这真的很好,但我认为nsec + 500应该是nsec +(nsec> 0?500:-500)才能正确地用负数进行舍入. (3认同)

How*_*ant 12

您可以将time_t转换为std :: chrono :: system_clock :: time_point:

class system_clock
{
public:
    ...
    static time_t     to_time_t  (const time_point& __t);
    static time_point from_time_t(time_t __t);
};
Run Code Online (Sandbox Code Playgroud)

你可以将time_t转换为ptime:

ptime from_time_t(time_t t);
Run Code Online (Sandbox Code Playgroud)

但是我没有看到将ptime转换为time_t的方法.

  • @EmileCormier:这是一个替代日期时间库,与`std :: chrono :: system_clock`具有更好的互操作性:http://howardhinnant.github.io/date_v2.html它将带你回到-32768年,并且向32767年前进. (2认同)