在C++中, 包含对二类时间操作的支持:
chrono
库,以各种精度跟踪时间的类型的灵活汇集(如 std::chrono::time_point )。(来自cppreference.com)
chrono库的写着可谓是长的一批
{
auto t = std::chrono::system_clock::now();
somexxx()
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(
(std::chrono::system_clock::now() - t))
.count()
<< std::endl;
}
有几个可以用的时钟,分别有:
std::cout << steady_clock::now().time_since_epoch().count() << std::endl;
std::cout << system_clock::now().time_since_epoch().count() << std::endl;
std::cout << high_resolution_clock::now().time_since_epoch().count() << std::endl;
他们都会返回一个time_point
类模板 std::chrono::time_point
表示时间中的一个点。它被实现成如同存储一个 Duration
类型的自 Clock
的纪元起始开始的时间间隔的值。
我们可以使用 put_time
来结合打印日期
{
auto t = system_clock::to_time_t(system_clock::now());
std::cout << std::put_time(localtime(&t), "%F %T\n");
}
可以使用Duration_cast
来进行单位换算
{
auto t = system_clock::now();
std::cout << duration_cast<microseconds>(t.time_since_epoch()).count()
<< " µs" << std::endl;
std::cout << duration_cast<milliseconds>(t.time_since_epoch()).count()
<< " ms" << std::endl;
std::cout << duration_cast<seconds>(t.time_since_epoch()).count()
<< " s" << std::endl;
}
我们还可以进行标量计算
{
auto t = 2021y / 10 / 1;
std::cout << (year(2021) == t.year()) << std::endl;
}
想用好chrono库,得要知道 duration
是个什么东西
template<
class Rep,
class Period = std::ratio<1>
>class duration;
由 Rep
类型的计次数和计次周期组成,其中计次周期是一个编译期有理数常量,表示从一个计次到下一个的秒数。
存储于 duration
的数据仅有 Rep
类型的计次数。若 Rep
是浮点数,则 duration
能表示小数的计次数。 Period
被包含为时长类型的一部分,且只在不同时长间转换时使用。
以下是各种时间标量之间的特化duration
;
/// nanoseconds
using nanoseconds = duration<_GLIBCXX_CHRONO_INT64_T, nano>;
/// microseconds
using microseconds = duration<_GLIBCXX_CHRONO_INT64_T, micro>;
/// milliseconds
using milliseconds = duration<_GLIBCXX_CHRONO_INT64_T, milli>;
/// seconds
using seconds = duration<_GLIBCXX_CHRONO_INT64_T>;
/// minutes
using minutes = duration<_GLIBCXX_CHRONO_INT64_T, ratio< 60>>;
/// hours
using hours = duration<_GLIBCXX_CHRONO_INT64_T, ratio<3600>>;
/// days
using days = duration<_GLIBCXX_CHRONO_INT64_T, ratio<86400>>;
/// weeks
using weeks = duration<_GLIBCXX_CHRONO_INT64_T, ratio<604800>>;
/// years
using years = duration<_GLIBCXX_CHRONO_INT64_T, ratio<31556952>>;
/// months
using months = duration<_GLIBCXX_CHRONO_INT64_T, ratio<2629746>>;
通过 duration_cast
将不同的duration
类的特化进行转换
time_point
当我们要统计时间间隔时,time_point
是不可或缺的的一个东西
template class time_point;
它可以和 duration
进行组合使用
time_point
负责时间的计算,duration
负责时间的进制转换
提供了std::time_t
, std::difftime
等
通过转换后,两种可以使用一样的接口进行访问
{
auto t = std::time(nullptr);
std::cout << std::ctime(&t) << std::endl;
auto r =
duration_cast<seconds>(system_clock::now().time_since_epoch()).count();
std::cout << std::ctime(&r) << std::endl;
}
[amjieker]