Как мне конвертировать boost :: posix_time :: ptime в time_t? - PullRequest
41 голосов
/ 16 декабря 2010

Есть какой-то "стандартный" способ или лучшее, что я могу сделать, это вычислить его напрямую, вычтя из gregorian::date(1970,1,1)?

Ответы [ 5 ]

34 голосов
/ 16 декабря 2010

Поскольку метод @ 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.hpp, std::time_t to_time_t(ptime pt).

15 голосов
/ 27 июля 2011

Вот вариант метода @ 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());
}
14 голосов
/ 16 декабря 2010

time_t - это тип, используемый для удержания времени в секундах (обычно времени эпохи). Я предполагаю, что вы вышли за время эпохи, если так, то я не знаю, каким образом можно реально получить время эпохи напрямую, кроме вычитания, которое у вас уже есть. Если у вас есть time_duration (результат вычитания), вы можете позвонить total_seconds() по продолжительности и сохранить его в time_t.

кстати. если вы находитесь в эпоху, вы можете просто использовать gettimeofday() и избавить себя от головной боли!

5 голосов
/ 16 декабря 2010

Я считаю, что лучшее, что вы можете сделать, это использовать to_tm для получения tm и mktime для преобразования tm в time_t.

2 голосов
/ 27 апреля 2012

Эти две строки должны сделать это.

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