can boost gregorian date and boost posix time properly calculate unixtime?
boost, c++, date, timestamp, unix-timestamp
Solution
Yes, that should work, but, to be certain, there's always experimental evidence:
#include <iostream>
#include <time.h>
#include <boost/date_time.hpp>
namespace bpt = boost::posix_time;
namespace bg = boost::gregorian;
int main()
{
bpt::time_duration dur = bpt::microsec_clock::universal_time()
- bpt::ptime(bg::date(1970, 1, 1));
timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
std::cout << std::setfill('0')
<< " boost: " << dur.total_seconds() << '.' << std::setw(6)
<< dur.fractional_seconds() << '\n'
<< " ctime: " << time(NULL) << '\n'
<< " posix: " << ts.tv_sec << '.' << std::setw(9)
<< ts.tv_nsec << '\n';
}
I get
Linux/gcc
boost: 1361502964.664746
ctime: 1361502964
posix: 1361502964.664818326
Sun/Sun Studio
boost: 1361503762.775609
ctime: 1361503762
posix: 1361503762.775661600
AIX/XLC
boost: 1361503891.342930
ctime: 1361503891
posix: 1361503891.342946000
and even Windows/Visual Studio
boost: 1361504377.084231
ctime: 1361504377
Looks like they all agree on how many seconds passed since `date(1970,1,1)`
Problem
I am trying to write a simple timestamping system that provides epoch seconds and fractional seconds from the current time. I am using boost library and have something like this: ``` const boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1)); boost::posix_time::ptime time() { boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time(); return now; } boost::posix_time::time_duration dur = (time() - epoch); ``` and then use the following elements to extract the epoch values: ``` dur.total_seconds(); dur.fractional_seconds(); ``` Specifically, will this return a proper unix time? If not, any suggestions as to how to correct it? Thanks.