如何找到自 01/JAN/1970 00:00:00 (UTC) 以来经过的纳秒数?

how to find the number nanoseconds elapsed since 01/JAN/1970 00:00:00 (UTC)?

我试图了解如何找到自 01/JAN/1970 00:00:00.

以来经过的纳秒数

我在 Internet 上找不到任何有关如何执行此操作的示例(或解释如何在不参考代码的情况下进行计算) 我在 windows 上研究 C++11。

您可以使用 std::chrono::system_clock - 请参阅 https://en.cppreference.com/w/cpp/chrono/system_clock。 在 C++20 之前,实际上未指定此时钟是在 1970 年还是其他时间开始(a.k.a。"epoch"),但 C++20 将保证那实际上是纪元,并且您应该验证您的 Windows 编译器是否已经符合此要求(我猜它符合,但没有 Windows 来确认)。

要获取纳秒数,可以使用std::chrono::duration_cast - https://en.cppreference.com/w/cpp/chrono/duration/duration_cast - 将时钟设置为std::chrono::nanoseconds,然后使用.time_since_epoch().count() 检索实际纳秒计数。但是,不能保证分辨率是多少……您可能无法用它来测量单个纳秒 - 分辨率可能只是微秒、毫秒或任何东西,即使指定为纳秒也是如此。你需要检查一下。

您可以使用 time_since_epoch() 方法将 time_point 转换为 duration,这将给出自 1970 年 1 月 1 日纪元以来的时间单位数。

然后,您只需将持续时间转换为纳秒即可。我能够用相对简单的代码做到这一点:

#include<iostream>
#include<chrono>

int main() {
    //Use system_clock, not steady_clock, or you will not get correct values!
    auto now = std::chrono::system_clock::now().time_since_epoch();
    auto now_ns = std::chrono::duration_cast<std::chrono::nanoseconds>(now);
    //Also valid, but doesn't convey programmer intent:
    //std::chrono::nanoseconds now_ns = now;
    std::cout << now_ns.count() << "ns" << std::endl;
}

在我的测试机器上,我得到以下输出:

1556833575688789496ns

注意两个潜在问题:

  • system_clock 没有特别高的精度。因此,您可能无法获得比几毫秒更准确的结果。
  • 如果您使用 C++20 进行编译,
  • system_clock 只能保证将其纪元设置为 1 月 1 日。在以前的版本中,它通常是这样实现的,但是一些符合规范的 C++ 编译器可能不会使用这个纪元,您需要这样验证。

这是我在之前的评论中提到的 Windows 特定的简单数学方法:

#include <windows.h>
#include <iostream>

int main() {
  FILETIME now;
  FILETIME epoch_ft;
  SYSTEMTIME epoch_st = { 1970, 1, 4, 1, 0, 0, 0, 0 }; 
  GetSystemTimeAsFileTime(&now);
  SystemTimeToFileTime(&epoch_st, &epoch_ft);

  ULARGE_INTEGER nsecs, epoch_nsecs;
  nsecs.LowPart = now.dwLowDateTime;
  nsecs.HighPart = now.dwHighDateTime;
  epoch_nsecs.LowPart = epoch_ft.dwLowDateTime;
  epoch_nsecs.HighPart = epoch_ft.dwHighDateTime;
  nsecs.QuadPart -= epoch_nsecs.QuadPart;

  std::cout << "100-nsec periods since epoch: " << nsecs.QuadPart << '\n';
  return 0;
}

上面获取当前系统时间作为filetime,和epoch的filetime,将两者相减得到从epoch开始的100纳秒间隔的个数。

Windows FILETIME自 1601 年 1 月 1 日以来 100 纳秒间隔的数量。它没有实际的纳秒分辨率,我 认为 GetSystemTimeAsFileTime() 使用的分辨率与 GetSystemTime() 一样是毫秒,但它可能与您一样准确你会得到。如果使用 Windows 8,Server 2012 或更高版本,还有一个 GetSystemTimePreciseAsFileTime() 可以用来代替获得支持的最高精度。