Boost C ++ fecha_hora microsec_clock y second_clock
Pregunta
descubrí un resultado extraño en la biblioteca de fecha y hora Boost C ++. No hay incompatibilidad entre microsec_clock
y second_clock
, y yo no entiendo por qué es eso. Estoy usando Windows XP 32-bits
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: enlace a fecha y hora impulso
Solución
No está seguro de lo que podría estar mal para usted; exactamente el mismo código 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 usos microsec_clock
gettimeofday
o GetSystemTimeAsFileTime
debajo, dependiendo de la plataforma. Algo parece mal con su plataforma - ¿cuál es su sistema operativo y versión
¿Cuál es su versión Boost? Si es 1,38 o inferior, actualice a 1.39 o aplicar el arreglo # 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;
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.
Otros consejos
La fecha de 1970 muy probablemente proviene de la forma Tiempo Unix está representado, como segundo de 1 de enero de 1970. me imagino que tal vez de alguna manera está recibiendo la disponibilidad del sistema en milisegundos e interpretarla como segundos desde 1/1/1970. Un tiempo de actividad de un poco más de 4 horas podría llegar a esta fecha.
A diferencia de second_clock
, la documentación microsec_clock::universal_time
menciones:. Devuelve la hora UTC en base a la configuración de informáticos
Debe comprobar la configuración del reloj de hardware (o donde quiera microseg obtiene sus valores de).
editar:
Si no es en relación con tus ajustes del que tendría que ser un mal comportamiento en el impulso, lo que dudo mucho.