我正在使用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<int>(period_in_months(start_date, end_date)
但收到了同样的错误。
答案 0 :(得分:4)
std::chrono::duration
模板的实例不会(甚至明确地)转换为int
。演员阵容无效。如果您查看this reference,就会发现没有转换运算符。
从std::chrono::duration_cast
的{{3}}你会发现
除非ToDuration是std :: chrono :: duration的实例,否则该函数不参与重载决策。
int
不是std::chrono::duration
的实例,因此您的第二次尝试将无效。
如果您再次查看std::chrono::duration
的引用,您会找到count
成员函数,
返回此持续时间的刻度数。
这就是你要找的东西。首先使用chrono::duration_cast
将持续时间转换为表示时间的表单,该表单具有适当的刻度持续时间(在本例中为一个月),然后在该持续时间表示上调用count
。如果您的持续时间已经在所需的表示中,则不需要持续时间演员步骤。
答案 1 :(得分:3)
以下是关于此主题的文章:
https://github.com/HowardHinnant/date/wiki/Examples-and-Recipes#deltamonths
文章从更多问题开始:
我们是否需要&#34;完整月份的数量&#34;?或许我们应该四舍五入 最接近的整数月数?或者我们想要一个浮点 几个月可以显示分数月的代表?
鉴于两个year_month_day
个对象d1
和d2
,以下是截断为零的月份差异:
(d2.year()/d2.month() - d1.year()/d1.month())
这会返回一个名为chrono
的{{1}}个持续时间。
以上完全忽略了每个日期的日期字段。如果您想将日期字段考虑在内并向最近的方向前进:
months
还有一种方法可以解决文章中显示的浮点月数。
一旦你有任何精度的auto dp1 = sys_days(d1);
auto dp2 = sys_days(d2);
auto delta = round<months>(dp2-dp1);
持续时间,任何表示,都可以使用chrono
.count()
成员函数获得该表示的值:
chrono::duration