Подтвердить что ты не робот

Как преобразовать boost:: posix_time:: ptime в time_t?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Так как метод @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);
}

EDIT: Спасибо @jaaw за то, что привлек это к моему вниманию. Поскольку boost 1.58 эта функция включена в date_time/posix_time/conversion.hpp, std::time_t to_time_t(ptime pt).

Ответ 3

Вот вариация метода @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());
}

Ответ 4

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

Ответ 5

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

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

Ответ 6

time_t t = boost::posix_time::to_time_t(boost::posix_time::second_clock::local_time());