【问题标题】:How to convert ‘std::chrono::duration<int, std::ratio<2629746l, 1l> >’ to ‘int’ type?如何将‘std::chrono::duration<int, std::ratio<2629746l, 1l> >’转换为‘int’类型?
【发布时间】:2016-10-17 11:01:45
【问题描述】:

我正在使用Howard Hinnant's date library,并试图找出两个日期之间的总月数。

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&lt;int&gt;(period_in_months(start_date, end_date),但收到了同样的错误。

【问题讨论】:

    标签: c++ date c++11 chrono static-cast


    【解决方案1】:

    这是一篇关于这个主题的文章:

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

    文章开头有更多问题:

    我们想要“整月”的数量吗?或者我们应该四舍五入 最接近的整数月数?或者我们想要一个浮点数 可以显示小数月份的月份表示形式?

    给定两个 year_month_day 对象 d1d2,以下是截断为零的月份差异:

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

    这会返回一个名为monthschrono 持续时间。

    上面完全忽略了每个日期的天字段。如果您想将日期字段考虑在内并朝最近的方向四舍五入:

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

    还有一种方法可以获得文章中显示的浮点月份的差异。

    一旦你有一个任何精度的chrono 持续时间,任何表示,你都可以使用chrono::duration.count() 成员函数获取该表示的值:

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

    【讨论】:

    • 还有,我们如何将 delta 转换为 int ?
    • @Shravan40:如果有帮助,这里有一个关于 chrono 的视频教程:youtube.com/watch?v=P32hvk8b13M 很高兴知道日期库是基于 chrono 构建的。
    • 当你的问题得到图书馆作者的回答时,总是感觉很特别。
    【解决方案2】:

    std::chrono::duration 模板的实例不能(甚至明确地)转换为int。演员表行不通。如果你看一下this reference,你会发现没有转换运算符。

    std::chrono::duration_castthis reference 你会发现

    除非 ToDuration 是 std::chrono::duration 的实例,否则该函数不参与重载决议。

    int 不是std::chrono::duration 的实例,因此您的第二次尝试将不起作用。


    如果你再看一下std::chrono::duration的引用,你会发现count成员函数,它

    返回此持续时间的刻度数。

    这就是你要找的。首先使用chrono::duration_cast 将持续时间转换为将时间表示为具有适当刻度持续时间(在本例中为一个月)的整数的形式,然后在该持续时间表示上调用count。如果您的持续时间已经在所需的表示中,则不需要持续时间施法步骤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 2013-06-28
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多