2017-08-26 109 views
1

請經過下面的QN的背景:
Why does clang++/g++ not giving correct microseconds output for chrono::high_resolution_clock::now() in Mac OSX?如何在Mac OSX中獲得真實的日曆微秒時間(1970年以來的時間)?

如上線已經討論過,我打算自1970年以來
現在使用chrono::high_resolution_clock::now().time_since_epoch()作品以及在流行的平臺,除了OSX &可能的iOS得到microseconds時間。在[我們] Mac系統,因爲系統重啓&不是自1970年以來

有任何便攜式[或Mac專用]的方式來獲得自1970年以來的時間,與microseconds精度產生了微秒的時間?
特定於Qt的解決方案也受到歡迎。

+0

確實['gettimeofday'(https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man2/gettimeofday.2.html)無法正常工作? – dbush

+3

由於目前在這個問題上有2個關閉的投票,我特此發佈我的意圖,如果投票結束,我打算重新打開這個問題。目前關閉的理由:不清楚被問到的是什麼,對我來說並不正確。我很清楚被問到什麼,而且我提供了一個答案。 –

+0

@dbush,我沒有使用該函數作爲「sys /」文件系統的一部分,這在Windows中可能不可移植。此外,我想使用C++ 11工具。 – iammilind

回答

4

在MacOS這是你如何能得到微秒1970-01-01以來UTC(不包括閏秒):

#include <chrono> 
#include <iostream> 

int 
main() 
{ 
    std::cout << std::chrono::system_clock::now().time_since_epoch().count() << "us\n"; 
} 

這只是對我輸出:

1503715928742714us 

這不是非常便攜。儘管所有平臺的system_clocks都測量自1970-01-01 UTC(未指定但實際標準)以來的時間,但它們以不同的精度進行測量。只有macOS使用微秒。可移植輸出微秒:

using namespace std::chrono; 
std::cout << time_point_cast<microseconds>(system_clock::now()).time_since_epoch().count() << "us\n"; 

如果你想做到這一點的操作,同時探索什麼精度等平臺測量這個時間,你可以使用Howard Hinnant's date/time library非常容易地做到這一點:

#include "date.h" 
#include <chrono> 
#include <iostream> 

int 
main() 
{ 
    using namespace date; 
    using namespace std::chrono; 
    std::cout << system_clock::now().time_since_epoch() << '\n'; 
} 

對我來說這只是輸出:

1503716308206361µs 

在gcc平臺上的單位將是ns。而在Windows上,單位將是[1/10000000]s,這是μs或100ns的1/10。


關於chrono::high_resolution_clock

該標準規定high_resolution_clock可以是用於system_clocksteady_clock一個類型別名,或者它可以是一個獨立的類型。在macOS和Windows上,high_resolution_clocksteady_clock的typedef。在海灣合作委員會high_resolution_clocksystem_clock的typedef。所以你不能依賴high_resolution_clock的類型或行爲。我不推薦使用它。


關於chrono::steady_clock

steady_clock就像一個秒錶。定時需要多長時間是非常棒的。但它無法告訴你一天的時間。它與任何平臺上的人體日曆都沒有任何關係。在macOS steady_clock上,這是計算機啓動後的一個納秒計數。

有關當前不同std::chrono鐘的視頻教程,請參閱https://www.youtube.com/watch?v=P32hvk8b13M


只有system_clock計數時間,因爲Unix epoch(事實上的標準,不是官方的)。有一個proposal under consideration,使這個官方,並添加這些額外的時鐘:

utc_clock:像system_clock,但包括閏秒。

tai_clock:自1958年1月1日00:00:00措施物理秒。每次出現閏秒時,提前一秒鐘撥打utc_clock全部分鐘有60秒。

gps_clock:像tai_clock但計算從1980年1月00:00:00 UTC的第一個星期日的時間。

file_clock:本建議成爲所述時鐘,在C++ 17的文件系統庫基於。沒有具體說明,但所有已知的實現都以某種方式與公民日曆相關。

+0

使用'time_point_cast <>'的解決方案在Mac中完美適用於我。我可以看到輸出的差值:-)'現在= 1809778988 現在= 1503723494460784'。 – iammilind

+1

非常好!很高興我能幫上忙。 –

相關問題