C++11 标准库也有坑(time-chrono)

    恰巧今天调试程序遇到时间戳问题, 于是又搜了搜关于取时间戳,以及时间戳转字符串的问题, 因为 time()   只能取到秒(win和linux)

想试试看能不能找到 至少可以取到毫秒的, 于是, 就找到 了 c++11 标准库:  std::chrono

然后做了实验, 测试了下,代码如下

1. windows版:

 View Code

 

输出如下:

t1=str2stmp(nullptr)             =1489397303
t2=str2stmp("2017-3-13 15:26:29")=1489389989
t3=stmp2str(t1)                  =2017-03-13 17:28:23
t4=stmp2str(t2)                  =2017-03-13 15:26:29

t4=stmp2str(tt1)                 =2017-03-13 17:28:23  14893973035294

 

2. linux版

 View Code

 

输出结果:

t1=str2stmp(nullptr)             =1489397692
t2=str2stmp("2017-3-13 15:26:29")=1489389989
t3=stmp2str(t1)                  =2017-03-13 17:34:52
t4=stmp2str(t2)                  =2017-03-13 15:26:29

t4=stmp2str(tt1)                 =2017-03-13 17:34:52  1489397692249265

 

3. 差异

两个版本的代码仅仅只是标红的地方的差异, 但也就是这个差异说明:

std::chrono::system_clock::now().time_since_epoch().count()
在 windows 下 和 linux 下 取到的 时间精度 很不一样啊, windows下 居然 位数都不对, 比linux 下 少两位数

请注意 是两位, 纳秒->微秒->毫秒,哪个精度的进制是10的?  难道不是1000吗?

  

4. 解决办法

getTimeStamp() 函数这样搞

1 std::time_t getTimeStamp()
2 {
3     std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
4     return tp.time_since_epoch().count();
5 }

 

5. 原因

见鬼的原因是:

windows系统的测试结果是system_clock的精度是100纳秒,而high_resolution的精度是1纳秒。

测试方法:

复制代码
 1 #include <iostream>  
 2 #include <chrono>  
 3 using namespace std;  
 4 int main()  
 5 {  
 6     cout << "system clock          : ";  
 7     cout << chrono::system_clock::period::num << "/" << chrono::system_clock::period::den << "s" << endl;  
 8     cout << "steady clock          : ";  
 9     cout << chrono::steady_clock::period::num << "/" << chrono::steady_clock::period::den << "s" << endl;  
10     cout << "high resolution clock : ";  
11     cout << chrono::high_resolution_clock::period::num << "/" << chrono::high_resolution_clock::period::den << "s" << endl;  
12     system("pause");  
13     return 0;  
14 }
复制代码

chrono中有三种时钟:system_clock,steady_clock和high_resolution_clock。每一个clock类中都有确定的time_point, duration, Rep, Period类型。

system_clock是不稳定的。因为时钟是可调的,即这种是完全自动适应本地账户的调节。这种调节可能造成的是,首次调用now()返回的时间要早于上次调用now()所返回的时间,这就违反了节拍频率的均匀分布。稳定闹钟对于超时的计算很重要,所以C++标准库提供一个稳定时钟 std::chrono::steady_clock。std::chrono::high_resolution_clock 是标准库中提供的具有最小节拍周期(因此具有最高的精度的时钟)。

上文所说time_since_epoch(),以及将要介绍的now()函数的返回值都依赖于时钟的精度。

 详细说明见:  c++11 chrono全面解析(最高可达纳秒级别的精度)

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。 原文链接:https://www.cnblogs.com/lzpong/p/6544117.html
posted @   _Ong  阅读(21103)  评论(3编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示