如何将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.hpp
, std::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
来获得一个tm
和mktime
来将tm
转换为time_t
。
这2行应该这样做。
tm td_tm = to_tm(pt); time_t tt = mktime(&td_tm);