如何将boost :: posix_time :: ptime转换为time_t?

有没有一些“标准”的方法,或者我能做的最好的方法是直接通过从gregorian::date(1970,1,1)减去来计算它?

time_t是用来保持时间的types(通常为纪元时间)。 我猜你是在时代之后,如果是这样的话,我不知道有什么方法可以直接推动实际获得新纪元的时间,除了已经有的减法。 一旦你有一个time_duration (减法的结果),你可以调用total_seconds()的持续时间,并存储在time_t

顺便说一句。 如果你是在时代之后,你可以简单地使用gettimeofday()并节省一些头痛!

由于@ icecrime的方法转换了两次(ptime在内部使用线性表示),所以我决定使用直接计算。 这里是:

 time_t to_time_t(boost::posix_time::ptime t) { using namespace boost::posix_time; ptime epoch(boost::gregorian::date(1970,1,1)); time_duration::sec_type x = (t - epoch).total_seconds(); // ... check overflow here ... return time_t(x); } 

编辑:谢谢@jaaw将此引起我的注意。 自boost 1.58以来,这个函数被包含在date_time/posix_time/conversion.hppstd::time_t to_time_t(ptime pt)

以下是@ ybungalobill方法的一个变种,可以让你过2038年,以防万一。 🙂

 int64_t rax::ToPosix64(const boost::posix_time::ptime& pt) { using namespace boost::posix_time; static ptime epoch(boost::gregorian::date(1970, 1, 1)); time_duration diff(pt - epoch); return (diff.ticks() / diff.ticks_per_second()); } 

我相信你能做的最好的就是使用to_tm来获得一个tmmktime来将tm转换为time_t

这2行应该这样做。

 tm td_tm = to_tm(pt); time_t tt = mktime(&td_tm);