¿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,>
davy.ai
El problema con el código es un error tipográfico en la función
getCurrentTimePoint
. El nombre del parámetro estimeZone
, pero se está utilizando comotimezone
(conz
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
atimeZone
en el cuerpo de la función:Después de este cambio, la función debería devolver correctamente puntos de tiempo con el desplazamiento de zona horaria dado.