2011-01-28 38 views
6

我想通过网络将boost::posix_time::ptime转换为boost::int64_t。根据A way to turn boost::posix_time::ptime into an __int64,我可以很容易地定义我自己的时期,并且只将该参考时期的time_duration转换为64位整数。但如何转换回ptime将int64_t转换为time_duration

#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转换成简单的数据类型。

+1

ticks()返回的值是否可以在机器之间移植?您可能需要使用ticks_per_second()对其进行标准化。如果myEpoch在两端都是相同的,为什么你不能传输一个64位毫秒的纪元时间戳? – hplbsh 2011-01-28 15:43:09

+0

它以毫秒分辨率工作。你可以发表你的评论作为答案吗? – tibur 2011-01-28 15:54:45

回答

5

是毫秒级工作液:

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上。

+3

我不认为这个答案适用于32位系统。我在一个使用1901-01-01 00:00:00的时代的32位系统上尝试了这一点,它不会工作。显然它适用于你,但毫秒()的参数是long类型的,而来自`total_milliseconds()`的返回值也是long类型的,所以你不会丢失从int64_t到long的隐式转换。 – mathematician1975 2013-10-15 10:17:46

2

作品有什么最大分辨率您boost::datetime库被编译成(通常为百万分之一/毫微秒):

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

微秒分辨率TIME_DURATION:

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

其中TICKS_PER_MICROSECOND是每微秒的滴答数(例如,如果滴答数为百万分之一,则为10,如在Windows FILETIME中)。

毫秒构造函数似乎适用于某些人的原因是它接受长参数类型,在某些编译器中它是64位。在MSVC中,它在32位平台上是32位,所以它不起作用。微秒构造函数接受一个64位整数,这应该是“对每个人都足够”。