c++11之日期和时间库
本文主要介绍 std::chrono日期和时间用法。 演示环境: vs2017
0、头文件
1 #include <chrono> 2 #include <thread>// 如果需要使用线程
1、duration
其表示一段时间,可以是这段时间单位可以是秒、分钟、小时、微秒,可以在 这里 看到详情(突然抽风,上不去了),无法贴出相关定义源码了。
一个例子,线程休眠2秒:
std::this_thread::sleep_for(std::chrono::seconds(2));
与之对应还有 nanoseconds、microseconds、milliseconds、minutes、hours。 因为看不到网页内容,凑合看下Vs2017中chrono文件中的定义吧。
1 using nanoseconds = duration<long long, nano>; 2 using microseconds = duration<long long, micro>; 3 using milliseconds = duration<long long, milli>; 4 using seconds = duration<long long>; 5 using minutes = duration<int, ratio<60>>; 6 using hours = duration<int, ratio<3600>>;
(类)模板! 具体的定义,大家可以去 MSDN 看看或者 cppreference 看看,这里主要介绍的是用法。
函数【std::this_thread::sleep_for】的参数需要一个std::chrono的一个时间段。 比如,定义一个时间段:
1 // 5秒 2 std::chrono::seconds second(5); 3 // 2毫秒 4 std::chrono::microseconds micro_seconds(2);
std::chrono 类还提供了关于数值的运算,包括: +、-、-=、+=、/、*、/=、 *= 等。
一个例子,生活中常见的是小时、分、秒,这里举例分钟和秒做运算。
1 // 50秒 2 std::chrono::seconds second_50(50); 3 // 2mins 4 std::chrono::minutes minute_2(2); 5 6 // 用秒保存结果 7 std::chrono::seconds ret_val = minute_2 - second_50; 8 9 // 输出当前结果 10 std::cout << ret_val.count();
这里,用 2分钟 减 50 秒, 结果为 70秒。 调用 std::chrono::count() 获取时钟周期:
还可以将 秒 转为 其他 格式输出,比如,秒转分钟,需要函数 std::chrono::duration_cast<>() 帮忙。 用法如下:
std::cout << "ret_val = " << std::chrono::duration_cast<std::chrono::minutes>(ret_val).count();
注意: 这里得到的是 整数。比如,这里的结果, 70秒, 转为分钟, 结果显示 1分钟。
2、time_point
翻看 duration时,看到下面还有 time_point。 如名,其表示一个时间点,单位: 秒。 起始时间是 1970.1.1 00:00:00 。这样,咱们可以分方便的计算 自 1970.1.1 00:00:00 后的当 某个时间点与 1970.1.1 00:00:00的间隔时间了。
其声明如下(来自Vs2017,其定义太长,有兴趣的可以了解下,这里仅给出定义):
template<class _Clock, class _Duration = typename _Clock::duration> class time_point;
它也是一个类模板,且需要搭配 duration和clock使用。
3、clock
Chrono提供了两种的clock:
A、system_clock - 系统时间,系统时间可能被修改
B、steady_clock - 记录时间,不会被修改。 换而言之,记录的是已经流逝的真正时间。
通常,获取当前时间点代码:
std::chrono::steady_clock::time_point tp1 = std::chrono::steady_clock::now();
time_point类也提供了算数运算: += 、-=
一个例子:计算两个时间点之间的间隔
1 std::chrono::steady_clock::time_point tp1 = std::chrono::steady_clock::now(); 2 // do something , 线程睡眠2秒 3 std::this_thread::sleep_for(std::chrono::seconds(2)); 4 std::chrono::steady_clock::time_point tp2 = std::chrono::steady_clock::now(); 5 6 std::cout << "time_interval = " << std::chrono::duration_cast<std::chrono::seconds>(tp2 - tp1).count() << "\n";
结果: