2015-08-24 212 views
2

我有一個下面的代碼,我們試圖從時代以來以微秒爲單位獲取當前時間戳,但我們使用的是steady_clock獲取自時代以來微秒的當前時間戳?

inline uint64_t get_timestamp() 
{ 
    std::chrono::time_point<std::chrono::steady_clock> ts = std::chrono::steady_clock::now(); 
    return std::chrono::duration_cast<std::chrono::microseconds>(ts.time_since_epoch()).count(); 
} 

這是因爲按照我的理解steady_clock用來測量時間沒拿到當天的當前時間的推移,這樣做的正確方法?或者我應該使用system_clock這個像下面所顯示的:

inline uint64_t get_timestamp() 
{ 
    std::chrono::time_point<std::chrono::system_clock> ts = std::chrono::system_clock::now(); 
    return std::chrono::duration_cast<std::chrono::microseconds>(ts.time_since_epoch()).count(); 
} 

我需要使用std::chrono包只因爲這就是我們所有的代碼使用。

+2

@πάνταῥεῖ'的std :: uint64_t'?反正至少再長一點。當前時間自本文寫作時的時間爲1440440480秒,即0x51dac207a0000微秒。 –

+1

@πάνταῥεῖ'uint64_t' ... –

+0

對不起,我們現在對納秒精度感到困惑。 –

回答

7

計時鐘的時代是未指定的。但是幾乎你能想到爲計時時鐘是這樣的:

  1. steady_clock的時代是應用程序啓動的時間加上一個簽名隨機偏移。即你不能依賴於跨應用程序啓動的時代。但是在應用程序運行時,時代將保持穩定。

  2. system_clock的時代是1970年以來的時間,不包括UTC時區的閏秒。不同的實現以不同的精度實現它:libC++計數微秒,VS計數爲1/10微秒,gcc計數納秒。

  3. high_resolution_clock有時是steady_clock的類型別名,有時是system_clock的類型別名。

的時間印記以微秒我建議先定義這種類型的別名:

using time_stamp = std::chrono::time_point<std::chrono::system_clock, 
              std::chrono::microseconds>; 

商店的那個,而不是uint64_t。這種類型的安全性將爲您節省無數的運行時間錯誤。你會在編譯時發現你的錯誤。

您可以獲得當前time_stamp有:

using namespace std::chrono; 
time_stamp ts = time_point_cast<microseconds>(system_clock::now()); 
+0

非常感謝您的建議。如果我們使用'steady_clock',我們會在閏年看到任何問題嗎? – user1950349

+0

你的意思是'system_clock' ?! –

+0

@ user1950349 - [閏秒](https://en.wikipedia.org/wiki/Leap_second)是對官方時間的調整,因爲地球軌道稍微搖擺(*非常*微微),所以有時我們會到達半秒早。計算機經常忽略這一點,因爲無論如何計算時間都很困難。 –

0

另一種可能的人誰不能得到其他解決方案的工作:

__int64 microseconds_since_epoch = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();