Есть ли какой-то «стандартный» способ или лучшее, что я могу сделать, это вычислить его напрямую путем вычитания из gregorian::date(1970,1,1)
?Как преобразовать boost :: posix_time :: ptime to time_t?
ответ
time_t
- тип, используемый для хранения времени в секундах (как правило, в эпоху). Я предполагаю, что вы после эпохи, если так, я не знаю ни о каком способе ускорения фактического получения времени в эпоху напрямую, кроме вычитания, которое вы уже сделали. Как только у вас есть 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);
}
EDIT: Благодаря @jaaw для чего это мое внимание. Начиная с boost 1.58 эта функция включена в date_time/posix_time/conversion.hpp
, std::time_t to_time_t(ptime pt)
.
такой жаль, что они не добавили это как прямой вызов функции в библиотеке ... Интересно, какие причины были ... – Nim 2010-12-16 22:49:12
Вот вариант метода @ 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 линии должны это сделать.
tm td_tm = to_tm(pt);
time_t tt = mktime(&td_tm);
Просто мысль; Я использую boost :: posix_time :: from_time_t (0) вместо явного времени в григорианском календаре, чтобы получить опорную точку, которая будет автоматически настраиваться на эпоху скомпилированной системы. – Rawler 2012-04-18 09:22:38
@ Rawler, это, вероятно, намного лучше - я обнаружил, что фактическая эпоха, по-видимому, 2000ns до того, что представлено «gregorian :: date (1970,1,1)». – 2012-10-25 19:07:34
@BrianCain Где вы придумали 2000ns перед печально известной эпохой? Насколько я помню и прочитал, я всегда слышал, что эпоха 1970-01-01 00: 00: 00.0 UTC. – 2014-09-17 00:07:11