Как вычесть месяцы из даты и справиться с переполнением?

0

В настоящее время я создаю библиотеку C++, которая включает вычитание месяцев с григорианской даты календаря. Мои добавленные месяцы работают, но моя формула вычитания не работает и вызывает ошибки. Вот код для формулы вычитания:

 Gregorian operator - ( Gregorian const& dt, detail::packaged_month const& month ) {
        year_t yearsToSubtract = month.nMonths_ / 12;
        month_t monthsToSubtract = month.nMonths_ % 12;
        year_t y = dt.year() - yearsToSubtract;
        month_t m = dt.month() - monthsToSubtract;

        int adjustment = ( m - 1 ) / 12 + ( m - 12 ) / 12;
        y -= adjustment;
        m += month_t( adjustment * 12 );

        day_t d = std::min( dt.day(), gregorian_days_in_month( m, is_gregorian_leapyear( y ) ) );

        return Gregorian( y, m, d );
    }

Результатом этого может быть, если я сделаю дату начала 2001,2,1 или 1 февраля 2001 года и минус 4 месяца, она должна вернуться 1 октября 2000 года, но я получаю ошибку исключения массива.

Теги:

1 ответ

0

Когда я использую ваш пример и предполагаю, что месяцы составляют 1-12 (а не 0-11), и все значения могут быть преобразованы в ints, я получаю следующие значения (в строках, которые они объявлены/изменены в вашем коде):

yearsToSubtract = 0
monthsToSubtract = 4
y = 2001
m = -2

adjustment = -1
y = 2002
m = -14

Поэтому, предполагая, что я правильно понял, и ваш отладчик поддерживает меня, я бы начал с первой строки, которая не является тем, что вы ожидаете от нее. Я ожидаю, что линия либо быть первыми m или adjustment.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню