Преобразовать в 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 бит целое число, которого должно быть "достаточно для всех".