2013-02-21 10 views
6

Sto provando a scrivere un semplice sistema di timestamping che fornisce secondi d'epoca e secondi frazionari dall'ora corrente. Sto usando libreria Boost e avere qualcosa di simile:può aumentare la data di gregorian e aumentare il tempo di posix calcolare correttamente unixtime?

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

e quindi utilizzare i seguenti elementi per estrarre i valori epoca:

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

In particolare, sarà questo ritorno un tempo adeguato unix? In caso negativo, qualche suggerimento su come correggerlo? Grazie.

risposta

5

Sì, che dovrebbe funzionare, ma, per essere certi, c'è sempre l'evidenza sperimentale:

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

ottengo

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 

e anche Windows/Visual Studio

boost: 1361504377.084231 
ctime: 1361504377 

sembra che tutti d'accordo su quanti secondi trascorsi dalla date(1970,1,1)

+0

ottimo punto a correre sperimentazione, e grazie per i risultati sul diverso sistemi, che aiuta molto. Avrei dovuto dire che stavo costruendo su Linux/gcc AND windows/vs2010. – brendon

Problemi correlati