恰巧今天調試程序遇到時間戳問題, 於是又搜了搜關於取時間戳,以及時間戳轉字符串的問題, 因為 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全面解析(最高可達納秒級別的精度)