Cómo obtener exactamente el mismo resultado de timeval con C++11 chrono.
En mi proyecto de C++, hay una función muy antigua que utilizaba la función del sistema de Linux para realizar algunos cálculos sobre el tiempo. Aquí está una parte del código:
struct timeval tv;
gettimeofday(&tv, NULL);
uint32_t seqId = (tv.tv_sec % 86400)*10000 + tv.tv_usec / 100;
* 10000
y / 100
no están mal, porque este código se trata de generar un seqId.
Ahora intento sustituirlo utilizando std::chrono
de C++11. Aquí está mi código:
std::chrono::high_resolution_clock::duration duration_since_midnight() {
auto now = std::chrono::high_resolution_clock::now();
std::time_t tnow = std::chrono::high_resolution_clock::to_time_t(now);
tm *date = std::localtime(&tnow);
date->tm_hour = 0;
date->tm_min = 0;
date->tm_sec = 0;
auto midnight = std::chrono::system_clock::from_time_t(std::mktime(date));
return now - midnight;
}
auto res = duration_since_midnight();
auto sec = std::chrono::duration_cast<std::chrono::seconds>(res);
auto mil = std::chrono::duration_cast<std::chrono::milliseconds>(res - sec);
std::cout << sec.count() * 10000 + mil.count() << std::endl;
Sin embargo, el resultado siempre es un poco erróneo. Por ejemplo, la antigua versión me podría dar 360681491
, pero mi versión me da 360680149
. Se puede ver que no son exactamente iguales.
No sé por qué. ¿O es que no es posible hacerlo con std::chrono
?
davy.ai
Es posible hacer esto con
std::chrono
. El problema probablemente se debe a la precisión de los cálculos. La funcióngettimeofday
devuelve el tiempo en microsegundos, mientras que las funciones destd :: chrono
devuelven el tiempo en nanosegundos. Para obtener el mismo resultado, deberá ajustar los cálculos en consecuencia. Por ejemplo, puede usarstd::chrono::microseconds
en lugar destd::chrono::milliseconds
al convertir el resultado.