恰巧今天调试程序遇到时间戳问题, 于是又搜了搜关于取时间戳,以及时间戳转字符串的问题, 因为 time() 只能取到秒(win和linux)
想试试看能不能找到 至少可以取到毫秒的, 于是, 就找到 了 c++11 标准库: std::chrono
然后做了实验, 测试了下,代码如下
1. windows版:
输出如下:
t1=str2stmp(nullptr) =
t2=str2stmp("2017-3-13 15:26:29")=
t3=stmp2str(t1) =-- ::
t4=stmp2str(t2) =-- :: t4=stmp2str(tt1) =-- ::
2. linux版
输出结果:
t1=str2stmp(nullptr) =
t2=str2stmp("2017-3-13 15:26:29")=
t3=stmp2str(t1) =-- ::
t4=stmp2str(t2) =-- :: t4=stmp2str(tt1) =-- ::
3. 差异
两个版本的代码仅仅只是标红的地方的差异, 但也就是这个差异说明:
std::chrono::system_clock::now().time_since_epoch().count()
在 windows 下 和 linux 下 取到的 时间精度 很不一样啊, windows下 居然 位数都不对, 比linux 下 少两位数
请注意 是两位, 纳秒->微秒->毫秒,哪个精度的进制是10的? 难道不是1000吗?
4. 解决办法
getTimeStamp() 函数这样搞
std::time_t getTimeStamp()
{
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());
return tp.time_since_epoch().count();
}
5. 原因
见鬼的原因是:
windows系统的测试结果是system_clock的精度是100纳秒,而high_resolution的精度是1纳秒。
测试方法:
#include <iostream>
#include <chrono>
using namespace std;
int main()
{
cout << "system clock : ";
cout << chrono::system_clock::period::num << "/" << chrono::system_clock::period::den << "s" << endl;
cout << "steady clock : ";
cout << chrono::steady_clock::period::num << "/" << chrono::steady_clock::period::den << "s" << endl;
cout << "high resolution clock : ";
cout << chrono::high_resolution_clock::period::num << "/" << chrono::high_resolution_clock::period::den << "s" << endl;
system("pause");
return ;
}
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()函数的返回值都依赖于时钟的精度。