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

iam*_*ind 2 c++ macos qt c++-chrono c++14

请仔细阅读下面的 Qn 了解上下文:
Why does clang++/g++ not Give 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 的解决方案。

How*_*ant 5

在 macOS 上,您可以通过以下方式获取自 1970-01-01 UTC 以来的微秒(不包括闰秒):

\n\n
#include <chrono>\n#include <iostream>\n\nint\nmain()\n{\n    std::cout << std::chrono::system_clock::now().time_since_epoch().count() << "us\\n";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这只是我的输出:

\n\n
1503715928742714us\n
Run Code Online (Sandbox Code Playgroud)\n\n

这不太便携。虽然所有平台的system_clock测量自 1970 年 1 月 1 日 UTC 以来的时间(未指定,但事实上的标准),但它们的精度不同。只有 macOS 使用微秒。要便携式输出微秒:

\n\n
using namespace std::chrono;\nstd::cout << time_point_cast<microseconds>(system_clock::now()).time_since_epoch().count() << "us\\n";\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想在探索其他平台这次测量的精度的同时执行此操作,您可以使用Howard Hinnant 的日期/时间库非常轻松地执行此操作:

\n\n
#include "date.h"\n#include <chrono>\n#include <iostream>\n\nint\nmain()\n{\n    using namespace date;\n    using namespace std::chrono;\n    std::cout << system_clock::now().time_since_epoch() << \'\\n\';\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

对我来说这只是输出:

\n\n
1503716308206361\xc2\xb5s\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 gcc 平台上,单位为ns. 在 Windows 上,单位是[1/10000000]s,即 \xc2\xb5s 的 1/10 或 100ns。

\n\n
\n\n

关于chrono::high_resolution_clock:

\n\n

标准指定可能是或high_resolution_clock的类型别名,也可能是单独的类型。在 macOS 和 Windows 上,是. 在 gcc 上是. 因此您不能依赖于 的类型或行为。我不推荐它的使用。system_clocksteady_clockhigh_resolution_clocksteady_clockhigh_resolution_clocksystem_clockhigh_resolution_clock

\n\n
\n\n

关于chrono::steady_clock:

\n\n

steady_clock就像秒表一样。它对于计时某件事需要多长时间非常有用。但它无法告诉您一天中的时间。它与任何平台上的人类日历都没有任何关系。在 macOS 上steady_clock,它是自计算机启动以来的纳秒计数。

\n\n

有关当前不同std::chrono时钟的视频教程,请参阅https://www.youtube.com/watch?v=P32hvk8b13M

\n\n
\n\n

只 system_clock计算自Unix 纪元以来的时间(事实上的标准,非官方)。有一项提案正在考虑将其正式化,并添加这些额外的时钟:

\n\n

utc_clock:类似system_clock,但包括闰秒。

\n\n

tai_clock:测量自 1958-01-01 00:00:00 以来的物理秒数。utc_clock每次 出现闰秒时都会提前一秒。所有分钟都有 60 秒。

\n\n

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

\n\n

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

\n