c++11之日期和时间库

本文主要介绍 std::chrono日期和时间用法。 演示环境: vs2017

0、头文件

1 #include <chrono>
2 #include <thread>// 如果需要使用线程

1、duration

其表示一段时间,可以是这段时间单位可以是秒、分钟、小时、微秒,可以在 这里 看到详情(突然抽风,上不去了),无法贴出相关定义源码了。

一个例子,线程休眠2秒:

std::this_thread::sleep_for(std::chrono::seconds(2));

与之对应还有nanosecondsmicrosecondsmillisecondsminuteshours。 因为看不到网页内容,凑合看下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() 获取时钟周期:

c++11之日期和时间库

还可以将 秒 转为 其他 格式输出,比如,秒转分钟,需要函数 std::chrono::duration_cast<>() 帮忙。 用法如下:

std::cout << "ret_val = " << std::chrono::duration_cast<std::chrono::minutes>(ret_val).count();

注意: 这里得到的是 整数。比如,这里的结果, 70秒, 转为分钟, 结果显示 1分钟。

c++11之日期和时间库

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";

结果:

c++11之日期和时间库

原文链接: https://www.cnblogs.com/pandamohist/p/13637444.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/202530

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午9:11
下一篇 2023年2月12日 下午9:11

相关推荐