Каков принцип поведения буст-аддитивного месяца? - PullRequest
3 голосов
/ 14 мая 2019

пример повышения добавить месяц

28/02/2009 + 1 месяц = ​​31.03.2009

#include <boost/date_time/gregorian/gregorian_types.hpp>
#include <boost/date_time/gregorian/formatters.hpp>
#include <iostream>
using namespace boost::gregorian;
using namespace std;

int main()
{
typedef boost::date_time::month_functor<date> add_month;
        date d(2019, Feb, 28);
        add_month mf(1);
        date d2 = d + mf.get_offset(d);
        cout << to_simple_string(d2) << endl;//output:2019-Mar-31
}

Выходные данные - 2019-март-31, а не 2019-март-28. Что является теоретической основой для такого поведения? Разговор об этом выводит 2019-март-28 как в C #, так и в delphi для аналогичного кода добавления месяца.

1 Ответ

6 голосов
/ 14 мая 2019

Это поведение упоминается в документации boost::date_time::month_functor.

Эта функция настройки обеспечивает логику для продвижения по месяцам в календаре на основе ymd. Политика, используемая для обработки несуществующих дней в конце месяца, заключается в резервном копировании до последнего дня месяца. Кроме того, если начальная дата - последний день месяца, этот функтор попытается скорректировать до конца месяца .

Таким образом, добавление месяца к 28 февраля приведет к 31 марта.
Но добавление месяца к 27 февраля приведет к 27 марта.

См. LIVE DEMO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...