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.

¿Por qué no se puede añadir una duración a un chrono::time_point en una función?

Estoy trabajando con std::chrono de C++11 y acabo de encontrar algo extraño. Aquí está mi demo:

// Tipo de punto de tiempo
template <typename t="std::chrono::milliseconds">
using Clock       = std::chrono::time_point<std::chrono::system_clock, t="">;
using TimePointMs = Clock<>;

// Obtener punto de tiempo actual
// El parámetro timeZone puede ser negativo
template <typename t="std::chrono::milliseconds">
inline Clock<t> getCurrentTimePoint(int8_t timeZone) {
    return std::chrono::time_point_cast<t>(std::chrono::system_clock::now()) +
        std::chrono::hours {timezone};
}

int main() {
    std::cout << "now0:" << std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::now()).time_since_epoch().count() << std::endl;
    auto now1 = std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::now())
        + std::chrono::hours {1};
    auto now2 = getCurrentTimePoint<std::chrono::seconds>(0);
    auto now3 = getCurrentTimePoint<std::chrono::seconds>(1);
    auto now4 = getCurrentTimePoint<std::chrono::seconds>(5);
    std::cout << "now1:" << now1.time_since_epoch().count() << std::endl
              << "now2:" << now2.time_since_epoch().count() << std::endl
              << "now3:" << now3.time_since_epoch().count() << std::endl
              << "now4:" << now4.time_since_epoch().count() << std::endl;

    return 0;
}

Como puedes ver, escribí una función muy simple que devuelve un punto de tiempo añadido con algunas std::chrono::hours.

Pero la salida es muy extraña.

now0:1641446050  // OK
now1:1641449650  // OK
now2:1641446050  // ???
now3:1641446050  // ???
now4:1641446050  // ???

Entonces now0 y now2 deberían ser UTC, now1 debería ser UTC + 1h. Pero ¿now3 y now4 son iguales a now0? Pasé un 3 y un 5 como parámetros de la función getCurrentTimePoint, ¿pero parece que simplemente desaparecieron?</std::chrono::system_clock,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con el código es un error tipográfico en la función getCurrentTimePoint. El nombre del parámetro es timeZone, pero se está utilizando como timezone (con z en minúscula) en el cuerpo de la función. Esto significa que el parámetro no se está utilizando en absoluto y la función siempre está devolviendo la hora actual sin ningún desplazamiento de zona horaria.

    Para solucionar esto, simplemente cambia timezone a timeZone en el cuerpo de la función:

    template <typename t="std::chrono::milliseconds">
    inline Clock<t> getCurrentTimePoint(int8_t timeZone) {
        return std::chrono::time_point_cast<t>(std::chrono::system_clock::now()) +
            std::chrono::hours {timeZone};
    }
    

    Después de este cambio, la función debería devolver correctamente puntos de tiempo con el desplazamiento de zona horaria dado.

Comments are closed.