【问题标题】:How to get the real calendar microseconds time (epoch since 1970) in Mac OSX?如何在 Mac OSX 中获取真正的日历微秒时间(自 1970 年以来的纪元)?
【发布时间】:2017-08-26 00:59:56
【问题描述】:

请通过下面的 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 的解决方案。

【问题讨论】:

  • gettimeofday 不能正常工作吗?
  • 由于该问题目前有 2 票赞成票,因此我特此发布我的投票意向,以便在该问题被关闭时重新开放该问题。目前关闭的理由:不清楚要问什么,对我来说不正确。我很清楚被问到什么,我已经提供了答案。
  • @dbush,我没有将该函数用作“sys/”文件系统的一部分,它在 Windows 中可能无法移植。此外,我想使用 C++11 工具。
  • 三个标准时钟中,只有system_clock 保证为您提供挂钟时间。 steady_clock 是“not related to wall clock time”和high_resolution_clockmay be an alias of ... steady_clock。”

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


【解决方案1】:

在 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,即 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 的 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 月的第一个星期日 00:00:00 UTC 以来的时间。

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

【讨论】:

  • 使用time_point_cast&lt;&gt; 的解决方案在Mac 中非常适合我。我可以看到输出的差异:-) now = 1809778988 now = 1503723494460784.
  • 太棒了!很高兴我能帮上忙。
猜你喜欢
  • 2011-08-31
  • 2011-01-03
  • 2011-01-16
  • 1970-01-01
  • 2015-11-18
  • 2019-07-10
  • 2011-08-06
  • 1970-01-01
  • 2020-11-17
相关资源
最近更新 更多