我想要做什么
我正在开发一个小型 discord 机器人来处理我和朋友们对电子竞技比赛的友好下注。最近我一直在尝试将比赛的日期和时间添加到:
- 仅显示即将进行的比赛
- 不允许添加过去日期的新匹配
- 以字符串形式显示比赛的日期和时间
我做了什么
因此我在 Google 上查找如何做到这一点,最后我得到了一个非常简单的类:
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;
};
问题
由于某种原因,使用相同的字符串作为输入,我不会得到相同的结果,这取决于我是否执行单元测试或机器人本身。
单元测试:
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");
}
所有结果都是绿色,因此工作正常。
但是,如果我使用日期“01-01-2028 18:00”执行我的 Discord 命令,我会收到此错误消息(提供过去日期时出现的错误):
用户错误:给定的日期 [12-10-2000 16:42] 是过去的日期。
如您所见,这不是我输入的日期。
调试
起初我以为命令和 DateTime 的构造函数之间出了问题,好像有什么东西改变了输入字符串。但是当我在构造函数中添加断点并检查时,输入字符串是正确的。所以我必须承认我真的不明白发生了什么。