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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top