es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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 estructura std::tm y pasar la cadena a std::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 objeto std::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() {
    std::vector timestamps = {
    “12:27:37.740002”,
    “19:37:17.314002”,
    “20:00:07.140902”
    };

    for (const auto& timestamp : timestamps) {
        // Analizar la cadena
        std::tm tm = {};
        std::stringstream ss(timestamp);
        ss >> std::get_time(&tm, "%H:%M:%S");
        int micros = std::stoi(timestamp.substr(9));
    
        // Crear un objeto time_point
        using namespace std::chrono_literals; // para sufijos como "s" y "us"
        auto tp = std::chrono::system_clock::from_time_t(std::mktime(&tm)) + micros * 1us;
    
        std::cout << timestamp << " -> " << tp.time_since_epoch().count() << '\n';
    }
    
    return 0;
    

    }
    “`

    En este código, recorremos cada marca de tiempo en el vector y realizamos los siguientes pasos:

    1. Crear un objeto std::tm (tm) para contener los valores extraídos.
    2. Crear un objeto std::stringstream (ss) a partir de la cadena de la marca de tiempo.
    3. Analizar la cadena usando std::get_time, pasando la dirección de tm y una cadena de formato (%H:%M:%S) para extraer las horas, minutos y segundos.
    4. Extraer los microsegundos de la cadena y almacenarlo en una variable entera (micros).
    5. Usando los valores extraídos, crear un objeto std::chrono::time_point (tp) con una precisión de microsegundos. Hacemos esto combinando un punto en el tiempo system_clock con la función mktime, que convierte un objeto tm en un objeto time_t. Luego agregamos los microsegundos a este punto en el tiempo usando la función std::chrono::duration_cast con la duración std::chrono::microseconds.
    6. Imprimir la cadena de la marca de tiempo original y el tiempo transcurrido desde la época (en microsegundos) del punto en el tiempo correspondiente.

    Al almacenar las marcas de tiempo como objetos std::chrono::time_point, podemos comparar y ordenar fácilmente utilizando los operadores estándar (<, >, ==, !=, etc).

Comments are closed.