Конвертировать int64_t в time_duration - PullRequest
6 голосов
/ 28 января 2011

Я хотел бы передать boost::posix_time::ptime по сети как boost::int64_t. В соответствии с способом превратить boost :: posix_time :: ptime в __int64 , я могу легко определить свою собственную эпоху и передать time_duration только из этой эталонной эпохи как 64 биты целые Но как конвертировать обратно в ptime?

#include <iostream>
#include <cassert>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/gregorian/greg_month.hpp>

using namespace std;

using boost::posix_time::ptime;
using boost::posix_time::time_duration;
using boost::gregorian::date;

int main(int argc, char ** argv){
    ptime t = boost::posix_time::microsec_clock::local_time();

    // convert to int64_t
    ptime myEpoch(date(1970,boost::gregorian::Jan,1));
    time_duration myTimeFromEpoch = t - myEpoch;
    boost::int64_t myTimeAsInt = myTimeFromEpoch.ticks();

    // convert back to ptime
    ptime test = myEpoch + time_duration(myTimeAsInt);

    assert(test == t);
    return 0;
}

Это не работает, так как конструктор time_duration, принимающий количество тиков в качестве аргумента, является закрытым. Я также заинтересован в любом другом способе просто передать это ptime через простые типы данных.

Ответы [ 3 ]

5 голосов
/ 28 января 2011

Рабочий раствор с разрешением в миллисекундах:

int main(int argc, char ** argv){
    ptime t = boost::posix_time::microsec_clock::local_time();

    // convert to int64_t
    ptime myEpoch(date(1970,boost::gregorian::Jan,1));
    time_duration myTimeFromEpoch = t - myEpoch;
    boost::int64_t myTimeAsInt = myTimeFromEpoch.total_milliseconds();

    // convert back to ptime
    ptime test = myEpoch + boost::posix_time::milliseconds(myTimeAsInt);

    cout << test << endl;
    cout << t << endl;

    time_duration diff = test - t;

    assert(diff.total_milliseconds()==0);
    return 0;
}

Спасибо 12a6.

2 голосов
/ 26 ноября 2012

Работает с любым максимальным разрешением, с которым ваша библиотека boost::datetime скомпилирована (обычно micros / nanos):

time_duration time_duration_from_ticks(time_duration::tick_type ticks)
{
    return time_duration(
        0,                                           // hours
        0,                                           // minutes
        ticks / time_duration::ticks_per_second(),   // seconds
        ticks % time_duration::ticks_per_second());  // fractional_seconds
}

(Обратите внимание, что time_duration::tick_type - это ваш int64_t , если вы установили время повышения даты только с микросекундным разрешением, которое является значением по умолчанию.)

0 голосов
/ 22 июля 2016

С микросекундным разрешением time_duration:

boost::posix_time::microseconds( _ts / TICKS_PER_MICROSECOND )

, где TICKS_PER_MICROSECOND - это количество тактов в микросекунду (например, 10, если тики являются гектонансекундами, как в Windows FILETIME).

Причина, почемуконструктор миллисекунд, кажется, работает для некоторых людей, так как он принимает тип параметра long, который в некоторых компиляторах равен 64 битам.В MSVC это 32 бита на 32-битных платформах, поэтому он не будет работать.Конструктор микросекунд принимает 64-битное целое число, которого должно быть «достаточно для всех».

...