Сравнение даты в формате string

92
05 февраля 2022, 09:30

Написал функцию для сравнения двух дат в формате string между собой.Исходил из такой логики: сперва сравниваем год, если он меньше или равно(<=), или больше или равно(>=) тогда сравниваем месяц, если он меньше или равен(<=), или больше или равен(>=) тогда сравниваем дни по такой же схеме. Оно вроде бы считает хорошо, но в одном моменте получается неккоректно. Я долго сидел над этой функцией и сейчас просто не могу увидеть ошибку где она работает неккоректно.

    struct Compare
{
public:
    static bool compareDate(string date1, string date2, string _operator)
    {
        if (_operator == ">")
        {
            return compareBig(date1.substr(6, 4), date2.substr(6, 4));
        }
        else if (_operator == ">=")
        {
            if (compareBigEquals(date1.substr(6, 4), date2.substr(6, 4)))
            {
                if (compareBigEquals(date1.substr(3, 2), date2.substr(3, 2)))
                {
                    if (compareBigEquals(date1.substr(0, 2), date2.substr(0, 2)))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        else if (_operator == "<=")
        {
            if (compareLessEquals(date1.substr(6, 4), date2.substr(6, 4)))
            {
                if (compareLessEquals(date1.substr(3, 2), date2.substr(3, 2)))
                {
                    if (compareLessEquals(date1.substr(0, 2), date2.substr(0, 2)))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        else if (_operator == "<")
        {
            return compareLess(date1.substr(6, 4), date2.substr(6, 4));
        }
    }
private:
    static bool compareBigEquals(string date1, string date2)
    {
        if ((stoi(date1) > stoi(date2)) || (stoi(date1) == stoi(date2)))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    static bool compareLessEquals(string date1, string date2)
    {
        if ((stoi(date1) < stoi(date2)) || (stoi(date1) == stoi(date2)))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    static bool compareBig(string date1, string date2)
    {
        if ((stoi(date1) > stoi(date2)))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    static bool compareLess(string date1, string date2)
    {
        if ((stoi(date1) < stoi(date2)))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};


int main()
{
    string date1 = "01.01.1999";
    string date2 = "20.07.2000";
    string date3 = "13.03.2001";
    cout << date1 << ">" << date2 << "=" << Compare::compareDate(date1, date2, ">") << endl;
    cout << date1 << "<" << date2 << "=" << Compare::compareDate(date1, date2, "<") << endl;
    cout << date1 << ">=" << date2 << "=" << Compare::compareDate(date1, date2, ">=") << endl;
    cout << date1 << "<=" << date2 << "=" << Compare::compareDate(date1, date2, "<=") << endl;
    cout << date2 << ">" << date3 << "=" << Compare::compareDate(date2, date3, ">") << endl;
    cout << date2 << "<" << date3 << "=" << Compare::compareDate(date2, date3, "<") << endl;
    cout << date2 << ">=" << date3 << "=" << Compare::compareDate(date2, date3, ">=") << endl;
    cout << date2 << "<=" << date3 << "=" << Compare::compareDate(date2, date3, "<=") << endl;
    cout << date3 << ">" << date1 << "=" << Compare::compareDate(date3, date1, ">") << endl;
    cout << date3 << "<" << date1 << "=" << Compare::compareDate(date3, date1, "<") << endl;
    cout << date3 << ">=" << date1 << "=" << Compare::compareDate(date3, date1, ">=") << endl;
    cout << date3 << "<=" << date1 << "=" << Compare::compareDate(date3, date1, "<=") << endl;
    system("pause");
}

Посмотрим на скриншот вывода. Вроде все работает хорошо, но в выводе не нравится выделенная строка.

В данном случае мы сравниваем даты 20.07.2000 и 13.03.2001. В функции static bool compareLessEquals(string date1, string date2) { if ((stoi(date1) < stoi(date2)) || (stoi(date1) == stoi(date2))) { return true; } else { return false; } } идет проверка на год. 2000 меньше 2001, и значит совершенно верно возвращает true. Если у меня функция при сравнении годов возвращает true тогда сравнение идет вглубь, т.е. мы начинаем сравнивать месяцы. 7 больше 3, но у нас проверка идет на <= поэтому возвращает false и это значит что дата 20.07.2000 не меньше или равно 13.03.2001. А должно наоборот. Кто знает как решить данную проблему? Нужен свежий взгляд на проблему

Answer 1

Первый свежий взгляд - передавать в функцию сравнения строку вида сравнения - нонсенс...

Второй взгляд - у вас жестко задан формат даты (раз уж вы постоянно выдираете куски из строки - значит, она всегда имеет вид DD.MM.YYYY). Не мучаемся, и пишем вспомогательную функцию типа

int s2date(const string& s)
{
    return (atoi(s.c_str()+6)*100+atoi(s.c_str()+3))*100+atoi(s.c_str());
}

которая из "20.07.2000" делает число типа 20000720, каковые сравнивать легко и просто, а главное, для них обычные сравнения работают изначально корректно!

Можно, конечно, исправлять логику вашего кода, но зачем?...

Намекну разве... Если вы сравниваете, например, как "меньше" - то если год1 меньше года 2 - то верните true, если больше - верните false, а вот если равны - то надо переходить к месяцам и продолжать сравнение. А если и месяцы равны - то к дням.

READ ALSO
Не запускается exe вне qt creator

Не запускается exe вне qt creator

Работаю в qt creator, все запускаетсяПри попытке запустить exe вне creator ничего не происходит

65
Помогите с алгоритмом обхода бинарного дерева в ширину с++

Помогите с алгоритмом обхода бинарного дерева в ширину с++

Помогите пожалуйста с алгоритмом обхода дерева в ширину на с++ Вот код:

70
Создать пару в MAP

Создать пару в MAP

Смысл цикла: вводятся с клавиатуры s1 и s2Если mapT[s2] существует, то заносится в multiset значение

98