Я пишу приложение, которое нуждается в возможности сравнить две даты. Это то, что у меня есть до сих пор:C++ - сравните две даты
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.
Почему?
Я прочитал это: C++ compare to string dates
Для сравнения двух дат нет определенного 'operator>' for 'std :: string'. Чего ты ожидал? –
@ πάνταῥεῖ Однако, если вы представляете две даты в формате ISO «ГГГГ-ММ-ДД», то лексикографическое сравнение таких строк также происходит правильно. –
'tm_year' - текущий год минус 1900; например 2015 год представлен как 105. Аналогичным образом, 'tm_month' основан на нулевом значении: 0 за январь, 11 декабря. Если бы вы попытались выполнить минимальную отладку и фактически просмотрели содержимое «date1» и «date2» перед сравнением, вы бы это заметили сами. –