【发布时间】:2015-07-19 13:16:22
【问题描述】:
我正在编写一个需要比较两个日期的应用程序。这是我目前所拥有的:
struct entry {
string text;
string date; // format: dd.mm.yyyy
bool finished;
};
string addNulls(int number, int cols) {
string num = to_string(number);
if (num.size() < cols) {
int count = cols - num.size();
for (int i = 0; i < count; i++) {
num = "0" + num;
}
}
return num;
}
// [...]
entry e = {"here is some text", "21.03.2019", false};
int day2 = atoi(e.date.substr(0, 2).c_str());
int month2 = atoi(e.date.substr(3, 2).c_str());
int year2 = atoi(e.date.substr(6, 4).c_str());
time_t t = time(0);
struct tm * now = localtime(&t);
string date1 = e.date.substr(6, 4) + "-" + e.date.substr(3, 2) + "-" + e.date.substr(0, 2) + " 00:00:00";
string date2 = addNulls(now->tm_year, 4) + "-" + addNulls(now->tm_mon, 2) + "-" + addNulls(now->tm_mday, 2) + " 00:00:00";
if(date2 > date1) {
// do something
}
代码得到一个包含日期的“入口”结构。比代码将日期与实际时间进行比较。问题是,它不起作用!我用一些示例内容运行了一些测试,但结果 (date2 > date1) 返回 false。
为什么?
【问题讨论】:
-
通过比较两个日期,没有为
std::string定义operator>。你期待什么? -
@πάνταῥεῖ 但是,如果您以
YYYY-MM-DD的 ISO 格式表示两个日期,那么这些字符串的字典比较也会正确地对日期进行排序。 -
tm_year是存储实际年份减去1900;例如2015 年表示为 105。类似地,tm_month从零开始:0 表示 1 月,11 表示 12 月。如果您尝试过最少的调试并在比较之前实际查看了date1和date2的内容,您自己就会注意到这一点。 -
@IgorTandetnik 好吧,OP 应该明确比较的实际输入包括哪些内容。
-
@πάνταῥεῖ OP 显示了在比较之前构建两个字符串的代码。对我来说看起来很清楚。