2013-02-21 6 views
6

Próbuję napisać prosty system sygnatur czasowych, który zapewnia epokę sekund i ułamek sekundy od bieżącego czasu. Używam biblioteki Boost i mieć coś takiego:może podnieść datę gregoriańską i zwiększyć czas posiksu poprawnie obliczyć czas uniksowy?

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); 

a następnie użyć następujące elementy, aby wyodrębnić wartości epoka:

dur.total_seconds(); 
dur.fractional_seconds(); 

Konkretnie będzie to powrót do właściwego czas uniksowy? Jeśli nie, wszelkie sugestie, jak to poprawić? Dzięki.

Odpowiedz

5

Tak, to powinno działać, ale mieć pewność, że zawsze dowody eksperymentalne:

#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'; 
} 

uzyskać

Linux/gcc

boost: 1361502964.664746 
ctime: 1361502964 
posix: 1361502964.664818326 

Sun/Sun Studio

boost: 1361503762.775609 
ctime: 1361503762 
posix: 1361503762.775661600 

AIX/XL C

boost: 1361503891.342930 
ctime: 1361503891 
posix: 1361503891.342946000 

a nawet Windows/Visual Studio

boost: 1361504377.084231 
ctime: 1361504377 

Wygląda jak wszyscy zgadzają się na ile sekund upłynęły od date(1970,1,1)

+0

wielkim punktem na prowadzenie eksperymentów, i dzięki za wyniki na inny systemy, które bardzo pomagają. Powinienem wspomnieć, że budowałem na Linux/gcc i windows/vs2010. – brendon

Powiązane problemy