Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

get boost::posix_time::time_duration in seconds

Tags:

c++

boost

I am using boost::posix_time::ptime to measure my simulation run-time and for something else.

assuimg

boost::posix_time::ptime start, stop;
boost::posix_time::time_duration diff;
start = boost::posix_time::microsec_clock::local_time();
sleep(5);
stop = boost::posix_time::microsec_clock::local_time();
diff = stop - stop;

now

std::cout << to_simple_string( diff ) << std::endl;

return the time in hh:mm:ss.ssssss format and i would like to have the time as well in ss.sssssss.

for doing this, i tried

boost::posix_time::time_duration::sec_type x = diff.total_seconds();

but that gave me the answer in format of ss and seconds() returns Returns normalized number of seconds (0..60).

My question how could i get my simulation time in seconds of the format ss.ssssss?

EDIT

i was able to do:

 std::cout << diff.total_seconds() << "." <<  diff.fractional_seconds() << std::endl;

is there something elegant that could plot ss.sssssss?

like image 328
Eagle Avatar asked Feb 08 '12 13:02

Eagle


3 Answers

total_seconds() returns a long value which is not normalized to 0..60s.

So just do this:

namespace bpt = boost::posix_time;

int main(int , char** )
{
    bpt::ptime start, stop;
    start = bpt::microsec_clock::local_time();
    sleep(62);
    stop = bpt::microsec_clock::local_time();

    bpt::time_duration dur = stop - start;

    long milliseconds = dur.total_milliseconds();

    std::cout << milliseconds << std::endl; // 62000

    // format output with boost::format
    boost::format output("%.2f");
    output % (milliseconds/1000.0);
    std::cout << output << std::endl; // 62.00
}
like image 146
nabulke Avatar answered Oct 13 '22 23:10

nabulke


// whatever time you have (here 1second)
boost::posix_time::ptime pt = boost::posix_time::from_time_t( 1 ); 
// subtract 0 == cast to duration
boost::posix_time::time_duration dur = pt - boost::posix_time::from_time_t(0); 
// result in ms
uint64_t ms = dur.total_milliseconds();
// result in usec
uint64_t us = dur.total_microseconds();
// result in sec
uint64_t  s = dur.total_seconds();
std::cout << "s = " << s << ", ms = " << ms << ", us = " << us << std::endl;

s = 1, ms = 1000, us = 1000000

like image 40
jschober Avatar answered Oct 13 '22 22:10

jschober


The most straight-forward way I see is something like this output, the rest of the time computations along the lines of nabulke's post:

#include <iomanip>
double dseconds = dur.total_milliseconds() / 1000. ;

std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(3);
std::cout << dseconds << std::endl;

You want to express time in terms of a floating point number, so it's probably best to actually use one and apply the standard stream formatting manipulators.

like image 45
Piotr99 Avatar answered Oct 14 '22 00:10

Piotr99