O que eu quero fazer
Estou trabalhando em um pequeno bot do Discord para lidar com apostas amigáveis em partidas de ESport com meus amigos. Ultimamente, tenho tentado adicionar a data e o horário das partidas para:
- Exibir apenas as próximas partidas
- Não permitir a adição de novas correspondências com datas passadas
- Exibir como uma string a data e os horários das partidas
O que eu fiz
Então pesquisei no Google como fazer isso e acabei com essa classe muito simples:
class DateAndTime
{
public:
explicit DateAndTime(const std::string& timeAsString)
{
std::istringstream timeAsStream{ timeAsString };
timeAsStream >> std::get_time(&m_Time, std::string{ DATE_TIME_FORMAT }.c_str());
if (timeAsStream.fail())
{
throw InvalidDateFormat(timeAsString);
}
}
[[nodiscard]] std::string ToString() const noexcept
{
std::stringstream resultAsStream;
resultAsStream << std::put_time(&m_Time, std::string{DATE_TIME_FORMAT}.c_str());
return resultAsStream.str();
}
[[nodiscard]] bool IsInFuture() noexcept
{
const std::time_t dateInSeconds = std::mktime(&m_Time);
const std::chrono::time_point now = std::chrono::system_clock::now();
const std::time_t nowAsSeconds = std::chrono::system_clock::to_time_t(now);
return dateInSeconds > nowAsSeconds;
}
private:
static constexpr std::string_view DATE_TIME_FORMAT = "%d-%m-%Y %H:%M";
std::tm m_Time;
};
O problema
Por algum motivo, com a mesma string como entrada, não tenho o mesmo resultado, dependendo se estou executando meus testes de unidade ou o próprio bot.
Os testes unitários:
TEST(DateAndTime_Tests, ToString)
{
const DateAndTime test{ "10-01-1995 18:00" };
EXPECT_EQ(test.ToString(), "10-01-1995 18:00");
const DateAndTime test2{ "10-01-1995 18:00:00" };
EXPECT_EQ(test2.ToString(), "10-01-1995 18:00");
const DateAndTime test3{ "01-01-2028 18:00" };
EXPECT_EQ(test3.ToString(), "01-01-2028 18:00");
}
Todos os resultados são verdes, então funciona bem.
Mas se eu executar meu comando do Discord com a data "01-01-2028 18:00" recebo esta mensagem de erro (meu erro ao informar uma data passada):
Erro do usuário: A data fornecida [12-10-2000 16:42] está no passado.
Como você pode ver, não é a data que informei.
Depuração
No começo, pensei que tinha um problema entre o comando e o construtor DateTime, como se algo estivesse alterando a string de entrada. Mas quando verifico adicionar um ponto de interrupção no construtor, a string de entrada está correta. Então, devo admitir que não entendo realmente o que está acontecendo.