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() 获取时钟周期:

  还可以将 秒 转为 其他 格式输出,比如,秒转分钟,需要函数  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";

  结果:

 

posted @ 2020-09-09 10:38  mohist  阅读(1572)  评论(0编辑  收藏  举报