Boost C ++ date_time microsec_clock e second_clock
Domanda
ho scoperto uno strano risultato Boost libreria di data e ora C ++. Non v'è incoerenza tra microsec_clock
e second_clock
, e non capisco perché è così. Sto usando Windows XP a 32 bit
Il mio snip di codice:
using namespace boost::posix_time;
...
ptime now = second_clock::universal_time();
std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl;
ptime now_2 = microsec_clock::universal_time();
std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl;
...
La stampa-out mi aspettavo sono ora corrente, senza millisecondi e con milliseonds. Tuttavia, ciò che ho nel mio pc è:
2009-10-14T16:07:38 1970-06-24T20:36:09.375890
Non capisco il motivo per cui v'è una data weired (1970 ???) nel mio tempo microsec_clock
. Documentazione correlata Per Boost: link data e ora spinta
Soluzione
Non sei sicuro di quello che potrebbe essere sbagliato per voi; lo stesso codice esatto funziona per me.
$ cat > test.cc #include <boost/date_time/gregorian/gregorian.hpp> #include <boost/date_time/posix_time/posix_time.hpp> using namespace boost::posix_time; int main() { ptime now = second_clock::universal_time(); std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl; ptime now_2 = microsec_clock::universal_time(); std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl; return 0; } ^D $ c++ -lboost_date_time test.cc $ ./a.out Current Time is: 2009-10-14T16:26:55 Current Time is: 2009-10-14T16:26:55.586295
Attuazione-saggio, second_clock
utilizza time
usi microsec_clock
e gettimeofday
o GetSystemTimeAsFileTime
sotto, a seconda della piattaforma. Qualcosa sembra sbagliato con la vostra piattaforma - qual è il vostro sistema operativo e la versione
Qual è la vostra versione Boost? Se si tratta di 1,38 o inferiore, l'aggiornamento a 1,39 o applicare la correzione a # 2809 manualmente.
--- boost/date_time/filetime_functions.hpp (revision 53621) +++ boost/date_time/filetime_functions.hpp (revision 53622) @@ -96,9 +96,7 @@ { /* shift is difference between 1970-Jan-01 & 1601-Jan-01 * in 100-nanosecond intervals */ - const uint64_t c1 = 27111902UL; - const uint64_t c2 = 3577643008UL; // issues warning without 'UL' - const uint64_t shift = (c1 << 32) + c2; + const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008 union { FileTimeT as_file_time;
di Windows FileTime ha un offset di tanto UNIX diverso, e il codice che era in prima Boost non genererebbe la differenza di offset corretto in alcuni compilatori ottimizzanti.
Altri suggerimenti
La data 1970 molto probabilmente deriva dal modo tempo unix è rappresentato, come secondi dalla 1 gennaio 1970. direi che forse è in qualche modo sempre il tempo di attività del sistema in millisecondi ed interpretandolo come secondi dal 1/1/1970. Un uptime di un po 'oltre 4 ore sarebbe venuto con questa data.
A differenza second_clock
, la documentazione microsec_clock::universal_time
menzioni:. restituisce il tempo UTC in base alle impostazioni del computer
Si dovrebbe controllare le impostazioni Orologio hardware (o dove mai microsec ottiene i suoi valori da).
modifica:
Se la sua non legati ai computer impostazioni avrebbe dovuto essere un comportamento scorretto in spinta, che dubito fortemente.