Boost C ++ date_time microsec_clock e segundo_clock
Pergunta
Descobri um resultado estranho no aumento da biblioteca do C ++ Date Time. Há inconsistência entre microsec_clock
e second_clock
, e não entendo por que isso. Estou usando o Windows XP 32 bits
Meu corte 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;
...
A impressão que eu esperava é o horário atual sem milissegundos e com Milliseonds. No entanto, o que tenho no meu PC é:
2009-10-14T16:07:38 1970-06-24T20:36:09.375890
Eu não entendo por que há uma data de Wireired (ano de 1970 ???) no meu microsec_clock
Tempo. Documentação relacionada para Boost: Link para o aumento da data da data
Solução
Não tenho certeza do que poderia estar errado para você; O mesmo código exatamente funciona para mim.
$ gato> test.cc #incluiru003Cboost/date_time/gregorian/gregorian.hpp> #incluiru003Cboost/date_time/posix_time/posix_time.hpp> Usando o namespace boost :: posix_time; int main () {ptime agora = segundo_clock :: universal_time (); std :: cout << "A hora atual é:" << to_iso_extended_string (agora) << std :: endl; ptime agora_2 = microsec_clock :: universal_time (); std :: cout << "A hora atual é:" << to_iso_extended_string (agora_2) << std :: endl; retornar 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
Em termos de implementação, second_clock
usos time
e microsec_clock
usos gettimeofday
ou GetSystemTimeAsFileTime
por baixo, dependendo da plataforma. Algo parece errado com sua plataforma - qual é o seu sistema operacional e versão?
Qual é a sua versão de impulso? Se for 1,38 ou menor, atualize para 1,39 ou aplique a correção para #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;
O Windows FileTime tem um deslocamento diferente do tempo do Unix, e o código que estava no Boost antes não geraria a diferença de deslocamento correta em determinados compiladores de otimização.
Outras dicas
A data de 1970 provavelmente vem do caminho tempo unix está representado, como segundos a partir de 1 de janeiro de 1970. Eu acho que talvez esteja de alguma forma obtendo o tempo de atividade do sistema em milissegundos e interprete -o em segundos desde 1/1/1970. Um tempo de atividade de pouco mais de 4 horas chegaria a essa data.
Diferente second_clock
, a microsec_clock::universal_time
Documentação menciona: Retorna o tempo da UTC com base em Configurações do computador.
Você deve verificar as configurações do relógio de hardware (ou de onde o Microsec obtém seus valores).
editar:
Se não estiver relacionado às configurações dos computadores, teria que ser um mau comportamento em impulso, o que duvido muito.