2016-10-17 1 views
3

Я использую Howard Hinnant's date library и пытаюсь найти общее количество месяцев между двумя датами.Как преобразовать 'std :: chrono :: duration <int, std :: ratio <2629746l, 1l>>' to 'int' type?

invalid static_cast from type ‘std::chrono::duration<int, std::ratio<2629746l, 1l> >’ to type ‘int’ 
    int period = static_cast<int>(period_in_months(start_date, end_date)); 

Вот функции, которые я использую:

auto period_in_months(year_month_day start_date, year_month_day end_time) { 
    auto total_months = ((end_time.year() - start_date.year())*12 + (end_time.month() - start_date.month())); 
    return (total_months--); 
} 

double percentage_return(string risk_profile, year_month_day start_date, year_month_day end_date) { 
    int period = static_cast<int>(period_in_months(start_date, end_date)); 
    // do something 
} 

Я попытался с помощью chrono::duration_cast<int>(period_in_months(start_date, end_date), но получил ту же ошибку.

ответ

3

Вот статья на эту тему:

https://github.com/HowardHinnant/date/wiki/Examples-and-Recipes#deltamonths

Статья начинается с большим количеством вопросов:

Хотите ли мы количество "полных месяцев"? Или, может быть, мы должны округлить до ближайший месяц интегральных месяцев? Или мы хотим, чтобы число месяцев, которое может показывать дробные месяцы, представляет собой число с плавающей запятой ?

Учитывая два year_month_day объектов d1 и d2, здесь разница в месяцах усеченных к нулю:

(d2.year()/d2.month() - d1.year()/d1.month()) 

Это возвращает chrono длительности под названием months.

Вышеописанное полностью игнорирует поле дня каждой даты.Если вы хотите, чтобы выйти на поле день во внимание и круг в направлении ближайшего:

auto dp1 = sys_days(d1); 
auto dp2 = sys_days(d2); 
auto delta = round<months>(dp2-dp1); 

Там также способ получить разницу в плавающей запятой месяцев, указанных в статье.

После того, как у вас есть chrono продолжительность любой точности, с любым представлением, можно получить значение этого представления с функцией .count() члена chrono::duration:

cout << delta.count() << '\n'; 
+0

И, как мы можем преобразовать 'delta' к int? – Shravan40

+0

@ Shravan40: обновленный ответ с этой деталью. –

+1

@ Shravan40: Если это помогает, вот видео-учебник только на хронологии: https://www.youtube.com/watch?v=P32hvk8b13M Полезно знать, как библиотека даты строит хронологию. –

4

Экземпляры std::chrono::duration шаблоны (даже не явно) конвертируются в int. Приведение не будет работать. Если вы посмотрите на this reference, вы обнаружите, что нет оператора преобразования.

От this reference из std::chrono::duration_cast вы обнаружите, что

Функция не участвует в разрешении перегрузки, если ToDuration не является экземпляром станд :: хроно :: длительности.

int не является экземпляр std::chrono::duration, так что ваша второй попытка не будет работать.


Если вы посмотрите на обращения std::chrono::duration снова, вы найдете функцию count член, который

Возвращает количество тиков для этого срока.

Это то, что вы ищете. Сначала используйте chrono::duration_cast, чтобы преобразовать продолжительность в форму, которая представляет время как целое число с соответствующей длительностью тика (месяц в этом случае), затем вызовите count на это представление продолжительности. Продолжительность старта не нужна, если ваша продолжительность уже находится в желаемом представлении.

Смежные вопросы