2009-10-14 15 views
6

Descubrí un extraño resultado en la biblioteca de fecha y hora de Boost C++. Hay una incoherencia entre microsec_clock y second_clock, y no entiendo por qué es eso. Estoy utilizando Windows XP de 32 bits deBoost C++ date_time microsec_clock y second_clock

Mi recorte de código:

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 impresión de que esperaba son hora actual sin milisegundos y con milliseonds. Sin embargo, lo que tengo en mi pc es:

 
2009-10-14T16:07:38 
1970-06-24T20:36:09.375890 

No entiendo por qué hay una fecha weired (año 1970 ???) en mi tiempo microsec_clock. documentación relacionada para Boost: link to boost date time

Respuesta

5

No estoy seguro de qué podría ser incorrecto para usted; el mismo código exacto funciona para mí.

 
$ 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 

Implementación-sabia, second_clock utiliza time y microsec_clock utiliza gettimeofday o GetSystemTimeAsFileTime debajo, dependiendo de la plataforma. Algo parece estar mal con su plataforma: ¿cuál es su sistema operativo y su versión?


¿Cuál es su versión de Boost? Si es 1.38 o inferior, actualice a 1.39 o aplique la corrección 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; 

de Windows FileTime tiene un desplazamiento diferente de vez en UNIX, y el código que se encontraba en Boost antes no generaría la diferencia de desplazamiento correcto en ciertos compiladores optimizadores.

+0

Estoy usando el sistema Win32, Windows XP SP2 32 bits para ser exactos. – Lily

+0

Estoy usando 1.39 ya con Eclipse 3.4.1 y MingW 3.4. Además, estoy teniendo la advertencia: Descripción de Recursos \t \t Ruta \t \t Localización Tipo C: /boost/boost_1_39/boost/date_time/filetime_functions.hpp dejado valor de desplazamiento> = anchura del tipo \t línea CommercialDetection 101 \t C/C++ problema como Bueno, – Lily

+0

Hmm, pensé que este arreglo estaba en 1.39 pero puedo volver a verificarlo. – ephemient

1

La fecha de 1970 muy probablemente proviene de la forma unix time se representa, como segundos desde el 1 de enero de 1970. Yo diría que tal vez de alguna manera está recibiendo la disponibilidad del sistema en milisegundos e interpretarla como segundo puesto 1/1/1970. Un tiempo de actividad de poco más de 4 horas vendría con esta fecha.

1

A diferencia second_clock, microsec_clock::universal_time la documentación menciona: Devuelve la hora UTC en base a la configuración del equipo .
Debe verificar la configuración de su reloj de hardware (o dondequiera que microsec obtenga sus valores).

edición:
Si no es relacionado con tus ajustes del que tendría que ser un mal comportamiento en el impulso, lo que dudo mucho.

+0

Muy buen punto, y también encontré esto: Obtenga la hora UTC utilizando un reloj de resolución secundaria. En sistemas Unix esto se implementa usando GetTimeOfDay. En la mayoría de las plataformas Win32, se implementa mediante ftime. Los sistemas Win32 a menudo no alcanzan una resolución de microsegundos a través de esta API. Si una resolución más alta es crítica para su aplicación, pruebe su plataforma para ver la resolución lograda. ===> Estoy usando el sistema Win32, así que tal vez no exista tal resolución en mi pc. Esa podría ser la razón. Sin embargo, la impresión me dio una fecha, ¿de dónde provienen esos números? ... – Lily

+0

En cuanto a la implementación, genera un time_type de la fecha actual y ftime() en create_time() si veo ese derecho. –

+0

Y si ftime() no es compatible con la resolución secundaria, esperaría perder la alta resolución y una alternativa a la siguiente mejor resolución. –

Cuestiones relacionadas