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

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

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

正如上面线程中已经讨论的,我打算得到 microseconds自 1970 年以来的时间。
现在使用chrono::high_resolution_clock::now().time_since_epoch()在除 OSX 和可能的 iOS 之外的流行平台上运行良好。在 [我们的] Mac 系统中,微秒时间是自系统重新启动后生成的,而不是自 1970 年以来生成的。

是否有任何可移植[或Mac特定]方法来获取自1970年以来的时间,精度为microseconds
也欢迎针对 Qt 的解决方案。

最佳答案

在 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 年 1 月 1 日 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 µs 或 100ns。


关于chrono::high_resolution_clock:

该标准指定 high_resolution_clock 可以是 system_clocksteady_clock 的类型别名,也可以是单独的类型。在 macOS 和 Windows 上,high_resolution_clocksteady_clock 的类型定义。在 gcc 上,high_resolution_clocksystem_clock 的类型定义。因此,您不能依赖 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 月第一个星期日 00:00:00 UTC 以来的时间。

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

关于c++ - 如何在 Mac OSX 中获取真实的日历微秒时间(自 1970 年以来的纪元)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45891010/

相关文章:

c++ - 手动计算增量时间

c++ - QtSerialPort 有不可用的数据,仅在 Windows 8 下出现段错误

c++ - 使用gdb,是否可以在静态对象销毁后添加断点?

c - Atoi(char *p) 函数

swift - 如何在 Swift 中将 XPC 自定义类列入白名单?

macos - 我怎样才能从Applescript调用brew

c++ - Qt:未定义对 'vtable for MyClass' 的引用

c++ - 如何在 BB10 中从 C++ 调用 QML 函数

c# - 如何从 C# 调用带有 int& 和 int* 参数的 C++ dll 函数?

c++ - Visual Studio Code 在终端中运行程序以进行输入