如何将‘std::chrono::duration<int, std::ratio<2629746l, 1l> >’转换为‘int’类型?
How to convert ‘std::chrono::duration<int, std::ratio<2629746l, 1l> >’ to ‘int’ type?
我正在使用 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)
但收到了同样的错误。
std::chrono::duration
模板的实例不能(甚至明确地)转换为 int
。演员表是行不通的。如果你看一下 this reference,你会发现没有转换运算符。
从 std::chrono::duration_cast
的 this reference 中你会发现
The function does not participate in the overload resolution unless ToDuration is an instance of std::chrono::duration.
int
不是 std::chrono::duration
的实例,因此您的第二次尝试将失败。
如果您再次查看 std::chrono::duration
的引用,您会发现 count
成员函数,
Returns the number of ticks for this duration.
这就是您要找的。首先使用 chrono::duration_cast
将持续时间转换为将时间表示为具有适当滴答持续时间(在本例中为一个月)的整数的形式,然后在该持续时间表示上调用 count
。如果你的持续时间已经在所需的表示中,那么持续时间施放步骤是不必要的。
这里有一篇关于这个主题的文章:
https://github.com/HowardHinnant/date/wiki/Examples-and-Recipes#deltamonths
文章开头有更多问题:
Do we want the number of "full months"? Or perhaps we should round to
the nearest number of integral months? Or do we want a floating-point
representation of months which can show fractional months?
给定两个 year_month_day
对象 d1
和 d2
,这里是截断为零的月份差异:
(d2.year()/d2.month() - d1.year()/d1.month())
这个 returns 一个 chrono
持续时间称为 months
。
上面完全忽略了每个日期的day字段。如果你想考虑天字段并向最近的四舍五入:
auto dp1 = sys_days(d1);
auto dp2 = sys_days(d2);
auto delta = round<months>(dp2-dp1);
还有一种方法可以得到文章中显示的浮点数月份的差异。
一旦你有任何精度的 chrono
持续时间,任何表示,就可以使用 chrono::duration
的 .count()
成员函数得到该表示的值:
cout << delta.count() << '\n';
我正在使用 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)
但收到了同样的错误。
std::chrono::duration
模板的实例不能(甚至明确地)转换为 int
。演员表是行不通的。如果你看一下 this reference,你会发现没有转换运算符。
从 std::chrono::duration_cast
的 this reference 中你会发现
The function does not participate in the overload resolution unless ToDuration is an instance of std::chrono::duration.
int
不是 std::chrono::duration
的实例,因此您的第二次尝试将失败。
如果您再次查看 std::chrono::duration
的引用,您会发现 count
成员函数,
Returns the number of ticks for this duration.
这就是您要找的。首先使用 chrono::duration_cast
将持续时间转换为将时间表示为具有适当滴答持续时间(在本例中为一个月)的整数的形式,然后在该持续时间表示上调用 count
。如果你的持续时间已经在所需的表示中,那么持续时间施放步骤是不必要的。
这里有一篇关于这个主题的文章:
https://github.com/HowardHinnant/date/wiki/Examples-and-Recipes#deltamonths
文章开头有更多问题:
Do we want the number of "full months"? Or perhaps we should round to the nearest number of integral months? Or do we want a floating-point representation of months which can show fractional months?
给定两个 year_month_day
对象 d1
和 d2
,这里是截断为零的月份差异:
(d2.year()/d2.month() - d1.year()/d1.month())
这个 returns 一个 chrono
持续时间称为 months
。
上面完全忽略了每个日期的day字段。如果你想考虑天字段并向最近的四舍五入:
auto dp1 = sys_days(d1);
auto dp2 = sys_days(d2);
auto delta = round<months>(dp2-dp1);
还有一种方法可以得到文章中显示的浮点数月份的差异。
一旦你有任何精度的 chrono
持续时间,任何表示,就可以使用 chrono::duration
的 .count()
成员函数得到该表示的值:
cout << delta.count() << '\n';