Estou implementando serialização json e desserialização de carimbos de data/hora com nlohmann::json
. Depois de transformar std::chrono::time_point
para mm/dd/yy hh:mm:ss
o estilo data-hora (de acordo com nossos requisitos, deve ser legível por humanos), naturalmente estou perdendo algumas informações, portanto, meu critério para a igualdade dos pontos no tempo após a desserialização é "diferente em não mais que um segundo".
Tudo estava funcionando bem na minha máquina local com o gcc 11.4.0, mas falhou no servidor de produção com o gcc 8.5.0.
Código mínimo para reproduzir o exemplo ao vivo do problema em godbolt :
#include <iostream>
#include <iomanip>
#include <chrono>
#include <string>
int main() {
// serialization
auto ts = std::chrono::system_clock::now();
auto timeS_t = std::chrono::system_clock::to_time_t(ts);
std::ostringstream outStream;
outStream << std::put_time(std::localtime(&timeS_t), "%x %X");
std::string tsStr = outStream.str();
// deserialization
std::istringstream ss(tsStr);
std::tm t = {};
ss >> std::get_time(&t, "%x %X");
auto parsedTs = std::chrono::system_clock::from_time_t(std::mktime(&t));
// difference in seconds
int secDiff = std::chrono::duration_cast<std::chrono::seconds>(ts - parsedTs).count();
// just debug prints
std::cout << secDiff << std::endl;
std::time_t ttp1 = std::chrono::system_clock::to_time_t(ts);
std::time_t ttp2 = std::chrono::system_clock::to_time_t(parsedTs);
std::cout << "ts1: " << std::ctime(&ttp1);
std::cout << "ts2: " << std::ctime(&ttp2);
// my equality criterion
if (std::abs(secDiff) > 1) {
std::cout << "FAIL\n";
}
}
Com o compilador mais recente, obtenho resultados iguais, por exemplo
ts1: Thu Feb 22 16:06:25 2024
ts2: Thu Feb 22 16:06:25 2024
mas com o antigo vejo a diferença nos pontos no tempo em exatamente 100 anos:
ts1: Thu Feb 22 16:06:17 2024
ts2: Fri Feb 22 16:06:17 1924
Acho que pode ter algo a ver com std::localtime(&timeS_t)
a rotina de serialização, mas não encontrei a função "reversa" para o desserializador. O que posso mudar para ter um comportamento consistente?