Consejos sobre cómo convertir una cadena de marca de tiempo en formato “HH:MM:SS.microsegundos”
Se me da una lista de marcas de tiempo (supongamos que tenemos un std::vector<std::string>
predefinido) en un formato de cadena de texto de la forma std::vector<std::string> = {"12:27:37.740002", "19:37:17.314002", "20:00:07.140902",...}
. Sin fechas, sin zonas horarias. ¿Cuál sería la mejor manera de analizar estas cadenas de texto en algún tipo de tipo de C++ (std::chrono::time_point
?) para poder realizar algunas comparaciones y ordenamientos más adelante?
Por ejemplo: comparar un valor que se analizó desde "20:00:07.140902"
y un valor que se analizó desde "20:00:07.000000"
.
C++17 está bien, pero no puedo usar ninguna biblioteca de terceros (Boost, Date, etc.).
Mantener la precisión de microsegundos es esencial.
davy.ai
Para analizar las marcas de tiempo en el vector, podemos usar la función
std::get_time
del encabezado<iomanip>
en C++17. Podemos crear una estructurastd::tm
y pasar la cadena astd::get_time
, junto con una cadena de formato para extraer horas, minutos, segundos y microsegundos. Una vez que tenemos esta información, podemos crear un objetostd::chrono::time_point
con los valores extraídos. Luego podemos comparar y ordenar estos puntos en el tiempo utilizando los operadores estándar.Aquí hay una implementación de ejemplo:
“`c++
#include
#include
#include
#include
int main() { timestamps = {
std::vector
“12:27:37.740002”,
“19:37:17.314002”,
“20:00:07.140902”
};
}
“`
En este código, recorremos cada marca de tiempo en el vector y realizamos los siguientes pasos:
std::tm
(tm
) para contener los valores extraídos.std::stringstream
(ss
) a partir de la cadena de la marca de tiempo.std::get_time
, pasando la dirección detm
y una cadena de formato (%H:%M:%S
) para extraer las horas, minutos y segundos.micros
).std::chrono::time_point
(tp
) con una precisión de microsegundos. Hacemos esto combinando un punto en el tiemposystem_clock
con la funciónmktime
, que convierte un objetotm
en un objetotime_t
. Luego agregamos los microsegundos a este punto en el tiempo usando la funciónstd::chrono::duration_cast
con la duraciónstd::chrono::microseconds
.Al almacenar las marcas de tiempo como objetos
std::chrono::time_point
, podemos comparar y ordenar fácilmente utilizando los operadores estándar (<
,>
,==
,!=
, etc).