2017-08-26 111 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

非常好!很高兴我能帮上忙。 –

相关问题