2009-10-14 18 views
6

Ho scoperto uno strano risultato nella libreria di data ora Boost C++. Esiste un'incoerenza tra microsec_clock e second_clock e non capisco perché sia ​​così. Sto usando Windows XP 32-bitBoost C++ date_time microsec_clock e second_clock

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 microsec_clock tempo. Documentazione correlata Per Boost: link to boost date time

risposta

5

Non so cosa potrebbe essere sbagliato per te; lo stesso identico codice 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 e microsec_clock utilizza gettimeofday o GetSystemTimeAsFileTime sotto, a seconda della piattaforma. Qualcosa non va nella tua piattaforma: qual è il tuo sistema operativo e la tua versione?


Qual è la tua versione Boost? Se è 1.38 o inferiore, eseguire 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.

+0

Sto usando il sistema Win32, Windows XP SP2 32 bit per la precisione. – Lily

+0

Sto usando 1,39 già con Eclipse 3.4.1 e MingW 3.4. Inoltre, sto avendo l'avvertimento: Descrizione \t Resource \t Percorso \t Località \t Tipo C: /boost/boost_1_39/boost/date_time/filetime_functions.hpp sinistra valore di scorrimento> = larghezza di tipo \t linea CommercialDetection 101 \t C/C++ problema bene – Lily

+0

Hmm, pensavo che questa soluzione fosse in 1.39, ma posso ricontrollare. – ephemient

1

La data 1970 probabilmente deriva dal modo unix time è rappresentato, come secondi dal 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 periodo di operatività di poco più di 4 ore sarebbe arrivato con questa data.

1

differenza second_clock, la documentazione microsec_clock::universal_time cita: Restituisce l'ora UTC in base a impostazioni del computer.
Controllare le impostazioni dell'orologio hardware (o da dove microsec ottiene i suoi valori).

edit:
Se proprio non legata ai computer impostazioni avrebbe dovuto essere un comportamento scorretto in spinta, che dubito fortemente.

+0

Ottimo punto, e ho anche trovato questo: Ottieni l'ora UTC utilizzando un orologio con risoluzione sub secondo. Sui sistemi Unix questo è implementato usando GetTimeOfDay. Sulla maggior parte delle piattaforme Win32 è implementato usando ftime. I sistemi Win32 spesso non raggiungono la risoluzione in microsecondi tramite questa API. Se la risoluzione più elevata è fondamentale per la tua applicazione, prova la tua piattaforma per vedere la risoluzione raggiunta. ===> Sto usando il sistema Win32, quindi forse non c'è una tale risoluzione nel mio pc. Questa potrebbe essere la ragione. Tuttavia, la stampa mi ha dato una data, allora da dove vengono questi numeri? ... – Lily

+0

Implementazione-saggio genera un time_type dalla data corrente e ftime() in create_time() se vedo quello giusto. –

+0

E se ftime() non supporta la risoluzione del secondo secondo mi aspetterei di perdere l'alta risoluzione e un fallback per la migliore risoluzione successiva. –