Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interoperability between boost::date_time and std::chrono

How interoperable are boost::date_time and std::chrono?

For example, is there a way to convert between boost::posix_time::ptime and std::chrono::time_point?

I tried searching for documentation on such conversions but couldn't find any.

like image 322
HighCommander4 Avatar asked Feb 05 '11 23:02

HighCommander4


2 Answers

I found this on the boost commits mailing list: http://lists.boost.org/boost-commit/2009/04/15209.php

Here are the relevant functions:

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

I'm not sure when they're going to become part of a boost release. They don't seem to be in boost trunk right now...

like image 54
HighCommander4 Avatar answered Sep 23 '22 11:09

HighCommander4


You can convert a time_t to and from a 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); }; 

And you can convert a time_t to a ptime:

ptime from_time_t(time_t t); 

However I don't see a way to convert a ptime to a time_t.

like image 28
Howard Hinnant Avatar answered Sep 24 '22 11:09

Howard Hinnant