持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情
在C++中, 包含对二类时间操作的支持:
chrono库,以各种精度跟踪时间的类型的灵活汇集(如 std::chrono::time_point )。- C 风格日期和时间工具(如 std::time )。
(来自cppreference.com)
chrono 库
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 Clock, class Duration = typename Clock::duration> class time_point;
它可以和 duration进行组合使用
time_point负责时间的计算,duration负责时间的进制转换
C 风格日期与时间库
提供了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;
}