如何在Mac OSX中获得真实的日历微秒时间(自1970年以来的纪元)?

时间:2017-08-26 00:59:56

标签: c++ macos qt c++14 chrono

请在下面的Qn中查看上下文:
Why does clang++/g++ not giving correct microseconds output for chrono::high_resolution_clock::now() in Mac OSX?

正如上文所述,我打算自1970年以来获得microseconds时间 现在使用chrono::high_resolution_clock::now().time_since_epoch()在流行的平台上运行良好,除了OSX&可能是iOS。在[我们]的Mac系统中,自系统重启以来产生了微秒时间。不是自1970年以来。

是否有任何便携式[或Mac特定]方式来获取自1970年以来的时间,精度为microseconds
Qt特有的解决方案也是受欢迎的。

1 个答案:

答案 0 :(得分: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_clock确实测量了自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,即1/10或100ns。

关于chrono::high_resolution_clock

该标准指定high_resolution_clock可以是system_clocksteady_clock的类型别名,也可以是单独的类型。在macOS和Windows上,high_resolution_clocksteady_clock的typedef。在gcc上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-01-01 00:00:00以来的物理秒数。每次闰秒时,在utc_clock之前移动一秒。 所有分钟都有60秒。

gps_clock:与tai_clock类似,但会测量自1980年1月1日星期日00:00:00 UTC以来的时间。

file_clock:建议将其作为C ++ 17文件系统库所基于的时钟。它没有指定,但所有已知的实现都以某种方式将其与民事日历联系起来。