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

时间:2010-12-16 14:08:11

标签: c++ boost boost-date-time

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

5 个答案:

答案 0 :(得分:33)

由于@ 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将此引起我的注意。由于提升1.58,此功能包含在date_time/posix_time/conversion.hppstd::time_t to_time_t(ptime pt)

答案 1 :(得分:15)

这是@ 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());
}

答案 2 :(得分:14)

time_t是用于以秒为单位保持时间的类型(通常为纪元时间)。我猜你是在大纪元以后的时间,如果是这样的话,除了你已经减法之外,我还没有意识到直接获得大纪元时间的任何方式。获得time_duration(减法结果)后,您可以在有效期内调用total_seconds()并将其存储在time_t

顺便说一句。如果你在大纪元之后,你可以简单地使用gettimeofday()并为自己节省一些头痛!

答案 3 :(得分:5)

我相信您所做的最好的事情就是使用to_tm获取tmmktimetm转换为time_t

答案 4 :(得分:2)

这两行应该这样做。

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