c++11 Chrono时间库的使用小结

 更新时间:2025年11月28日 09:51:15   作者:~一叶、  
本文主要介绍了c++11 Chrono时间库的使用小结,包括duration、clock和time_point,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 持续时间 duration

template<class Rep, class Period = ratio<1>>
class duration;

class Rep: 滴答数
class Period: 滴答周期,默认1秒

1) 常用方法

count / zero / min / max
支持算术运算 + - * / % ++ – += -= *= /= %= (不同的Period之间会自动转换)

2) 示例

duration<long, ratio<60>> d1(2);  //2分钟
duration<long, ratio<1>>  d2(30); //30秒
duration<double, ratio<60>> d3 = d1+d2; //2.5分
count << d3.count() << "minutes" << endl;

3) 标准定义

//X 64 bits表示:有符号整数类型,且位数至少为64位
typedef duration<X 64 bits, nano>  nanoseconds; //纳秒
typedef duration<X 55 bits, micro> microseconds; //微秒
typedef duration<X 45 bits, milli> milliseconds; //毫秒 
typedef duration<X 35 bits>        seconds; //秒 
typedef duration<X 29 bits, ratio<60>>    minutes; //分
typedef duration<X 23 bits, ratio<3600>>  hours; //时

//例
auto t = hours(1) + minutes(2) + seconds(45);
count << seconds(t).count() << endl;

2. 时钟 clock

  • system_clock 系统实时时钟的真实时间
  • steady_clock time_point绝不递减的时钟
  • high_resolution_clock 高精度时钟

1) 常用接口

// 均为静态接口
now()  //获取类型为time_point的当前时间点
to_time_t()  //将time_point转换为time_t类型
from_time_t()  //将time_t转换为time_point类型

localtime可将time_t类型转换为tm表示的本地时间

2) 示例

//获取当前时间
#include <time.h>      // time_t, locaktime, tm
#include <iomanip>     // put_time
system_clock::time_point tpoint = system_clock::now();
time_t tt = system_clock::to_time_t(tpoint);
tm* t = locaktime(&tt);
cout << put_time(t, "%H:%M:%S") << endl;
//计算代码的执行时间
auto start = system_clock::now();
// ... to do something
auto end = system_clock::now();
auto diff = end - start;
cout << duration<double, milli>(diff).count() << "ms" << endl;

3. 时点 time_point

  • time_point是一个时间点,存储相对于纪元(1970/01/01)的一个duration。
  • time_since_epoch() 返回当前时间点到纪元的duration。
  • 每一个time_point都关联一个clock,创建时需指定clock作为模板参数。

1) 构造函数

time_point();           //通过duration::zero初始化表示关联clock的纪元
time_point(const duration& d); //通过duration初始化表示纪元+d
template<class Duration2>
time_point(const time_point<clock, Duration2>& t); //通过t.time_since_epoch初始化

2) 示例

time_point<steady_clock> tp1;
tp1 += minutes(10);
auto d1 = tp1.time_since_epoch();
duration<double> d2(d1);
cout << d2.count() << "seconds" << endl;

获取时间差

#include <chrono>
#include <thread>


auto begin   = std::chrono::high_resolution_clock::now(); //起始
std::this_thread::sleep_for(std::chrono::milliseconds(800));//运行时长
auto end   = std::chrono::high_resolution_clock::now();//结束

//第一种 使用duration_cast计算
auto duration1 = std::chrono::duration_cast<std::chrono::seconds>(end - begin);
auto duration2 = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
auto duration3 = std::chrono::duration_cast<std::chrono::microseconds>(end - begin);
auto duration4 = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);

std::cout << duration1.count() << std::endl; //本机测试结果: 0
std::cout << duration2.count() << std::endl; //本机测试结果: 812
std::cout << duration3.count() << std::endl; //本机测试结果: 812698
std::cout << duration4.count() << std::endl; //本机测试结果: 812698500

//第二种 使用durantion
std::chrono::duration<double, std::ratio<1, 1>> elapsed1 = end - begin;
std::chrono::duration<double, std::ratio<1, 1000>> elapsed2 = end - begin;
std::chrono::duration<double, std::ratio<1, 1000000>> elapsed3 = end - begin;
std::chrono::duration<double, std::ratio<1, 1000000000>> elapsed4 = end - begin;

std::cout << elapsed1.count() << std::endl; //本机测试结果: 0.812698
std::cout << elapsed2.count() << std::endl; //本机测试结果: 812.698
std::cout << elapsed3.count() << std::endl; //本机测试结果: 812698
std::cout << std::fixed << std::setprecision(0) << elapsed4.count() << std::endl; //本机测试结果: 812698500

获取时间戳

//此处要用system_clock
auto now = std::chrono::system_clock::now();

//下面用到2种转换方式,一种time_point_cast,一种duration_cast

// 获取时间戳,单位为毫秒
auto ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now).time_since_epoch().count();
// 输出毫秒时间戳
std::cout << "Milliseconds timestamp: " << ms << std::endl;

// 获取时间戳,单位为秒
auto sec = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()).count();
// 输出秒时间戳
std::cout << "Seconds timestamp: " << sec << std::endl;

到此这篇关于c++11 Chrono时间库的使用小结的文章就介绍到这了,更多相关c++11 Chrono时间库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 实现旋转蛇错觉的详细代码

    C++ 实现旋转蛇错觉的详细代码

    这篇文章主要介绍了C++ 实现旋转蛇错觉的详细代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++右值引用问题解决

    C++右值引用问题解决

    本文主要介绍了C++右值引用问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 简单介绍C++编程中派生类的析构函数

    简单介绍C++编程中派生类的析构函数

    这篇文章主要介绍了C++编程中派生类的析构函数,析构函数平时一般使用较少,需要的朋友可以参考下
    2015-09-09
  • C语言中getchar函数详解看这一篇就够了(函数功能、使用、返回值)

    C语言中getchar函数详解看这一篇就够了(函数功能、使用、返回值)

    getchar读取字符的函数,今天通过本文给大家介绍C语言中getchar函数简介用法示例详解,感兴趣的朋友跟随小编一起看看吧
    2023-02-02
  • C语言实现的统计素数并求和代码分享

    C语言实现的统计素数并求和代码分享

    这篇文章主要介绍了C语言实现的统计素数并求和代码分享,来自PAT平台(浙江大学计算机程序设计能力考试系统)的一个题目,需要的朋友可以参考下
    2014-08-08
  • C语言fgetc和fputc函数用法详解(以字符形式读写文件)

    C语言fgetc和fputc函数用法详解(以字符形式读写文件)

    这篇文章主要介绍了C语言fgetc和fputc函数用法详解(以字符形式读写文件),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C++的数据共享与保护你了解吗

    C++的数据共享与保护你了解吗

    这篇文章主要为大家详细介绍了C语言零基础入门的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++中CString string char* char 之间的字符转换(多种方法)

    C++中CString string char* char 之间的字符转换(多种方法)

    在写程序的时候,我们经常遇到各种各样的类型转换,比如 char* CString string 之间的互相转换,这里简单为大家介绍一下,需要的朋友可以参考下
    2017-09-09
  • C语言动态顺序表实例代码

    C语言动态顺序表实例代码

    大家好,本篇文章主要讲的是C语言动态顺序表实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 构造函数定义为private或者protected的好处

    构造函数定义为private或者protected的好处

    从语法上来讲,一个函数被声明为protected或者private,那么这个函数就不能从“外部”直接被调用了。对于protected的函数,子类的“内部”的其他函数可以调用之。而对于private的函数,只能被本类“内部”的其他函数说调用
    2013-10-10

最新评论