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

Способ включения boost:: posix_time:: ptime в __int64

Кто-нибудь знает, есть ли хороший способ превратить boost::posix_time::ptime в значение __int64. (Я составил микросекундную версию, а не версию на наносекунде).

Мне нужно как-то это сделать, поскольку я ищу, чтобы сохранить полученный __int64 в типе union, который использует необработанные данные для высокопроизводительного приложения. Некоторый тип функциональности Memento, подобный этому, был бы очень полезен для меня. Я бы хотел, чтобы избежать бросков, если это возможно, но прибегать к ним, если мне нужно.

4b9b3361

Ответ 1

Преобразование ptime в целое число не имеет смысла, поскольку ptime является абстракцией фактического времени. Целочисленное время представляет собой представление того времени как счетчика из эпохи. То, что вы (возможно) хотите сделать, это генерировать time_duration от вашего времени до интересующей вас эпохи, а затем использовать time_duration:: ticks(), чтобы получить 64-битное целое число. Возможно, вам придется масштабировать результат до требуемой точности:

ptime myEpoch(date(1970,Jan,1)); // Or whatever your epocj is.
time_duration myTimeFromEpoch = myTime - myEpoch;
boost::int64_t myTimeAsInt = myTimeFromEpoch.ticks();

Ответ 2

из документов: http://www.boost.org/doc/libs/1_40_0/doc/html/date_time/posix_time.html

boost:: int64_t ticks()  Возвращает необработанный счетчик типа продолжительности (даст непредсказуемые результаты, если вызов time_duration является специальным_значением). time_duration td (0,0,0, 1000); td.ticks()//- > 1000

Ответ 3

Это легко сделать, используя классы chrono С++ 0x, которые основаны на упрощенной версии библиотеки времени/времени Boost, но, глядя на документы Boost, я не вижу ничего особенно очевидного. Фактически единственный способ сделать это, я вижу, это вызвать to_tm, чтобы преобразовать его в стандартный C struct tm, а затем умножить поля вместе. Это отвратительно, но должно работать (хотя вы захотите быть осторожным в прыжках секунд и т.д.).

Ответ 4

#include <boost/date_time/posix_time/posix_time.hpp>

// ...

uint64_t secondsSinceEpoch(const boost::posix_time::ptime& time) {
    namespace bpt = boost::posix_time;
    const bpt::ptime epoch = bpt::from_time_t(0);
    bpt::time_duration duration = time - epoch;
    return duration.total_seconds();
}

// ...

namespace bpt = boost::posix_time;
const bpt::ptime now = bpt::second_clock::local_time();
uint64_t seconds = secondsSinceEpoch(now);
std::cout << "seconds: " << seconds << std::endl;