2010-12-16 2 views
39

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

+4

Просто мысль; Я использую boost :: posix_time :: from_time_t (0) вместо явного времени в григорианском календаре, чтобы получить опорную точку, которая будет автоматически настраиваться на эпоху скомпилированной системы. – Rawler 2012-04-18 09:22:38

+0

@ Rawler, это, вероятно, намного лучше - я обнаружил, что фактическая эпоха, по-видимому, 2000ns до того, что представлено «gregorian :: date (1970,1,1)». – 2012-10-25 19:07:34

+1

@BrianCain Где вы придумали 2000ns перед печально известной эпохой? Насколько я помню и прочитал, я всегда слышал, что эпоха 1970-01-01 00: 00: 00.0 UTC. – 2014-09-17 00:07:11

ответ

14

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

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

5

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

+3

Но я верю, что mktime имеет неявное регулирование часового пояса (оно показывает количество секунд от эпохи по местному времени) – gerrytan 2013-01-17 01:03:39

31

Поскольку метод 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).

+13

такой жаль, что они не добавили это как прямой вызов функции в библиотеке ... Интересно, какие причины были ... – Nim 2010-12-16 22:49:12

14

Вот вариант метода @ 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

Эти 2 линии должны это сделать.

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