Преобразовать в int64 t к длительности

Я хотел бы передать 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 ответов


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

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.


работает с любым максимальным разрешением вашего 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 если вы настроили boost datetime только с разрешением микросекунды, которое является значением по умолчанию.)


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

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

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

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