Есть ли какой-то "стандартный" способ или я могу сделать это, просто вычислить его, вычитая из gregorian::date(1970,1,1)
?
Как преобразовать boost:: posix_time:: ptime в time_t?
Ответ 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());