如何找到自1970年1月1日00:00:00(UTC)起经过的纳秒数?

时间:2019-05-02 21:26:07

标签: c++ c++11 utc

我试图了解如何找到自1970年1月1日00:00:00以来经过的纳秒数。

我在互联网上找不到任何有关如何执行此操作的示例(或解释了如何在不参考代码的情况下进行计算) 我正在Windows上使用C ++ 11。

3 个答案:

答案 0 :(得分:3)

您可以使用time_point方法将duration转换为time_since_epoch(),该方法将给出自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 ++编译器可能未使用此时期,因此您需要进行验证。

答案 1 :(得分:1)

您可以使用std::chrono::system_clock-参见https://en.cppreference.com/w/cpp/chrono/system_clock。 在C ++ 20之前,实际上还不确定该时钟是在1970年还是其他时间开始(也称为“时代”),但是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()来获取实际值。纳秒计数。但是,不能保证它的分辨率是多少...用这种方法可能无法测量单个纳秒-分辨率可能仅为微秒,毫秒或其他任何值,即使指定为纳秒也是如此。您需要检查。

答案 2 :(得分:1)

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

Tensorflow 2.0

上面的方法获取当前系统时间作为文件时间以及该纪元的文件时间,然后减去两者以得到自该纪元以来的100纳秒间隔数。

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; } 自1601年1月1日以来100纳秒间隔的数量。它没有实际的纳秒分辨率,我认为FILETIME使用的分辨率与GetSystemTimeAsFileTime()一样是毫秒,但是它可能与您将要使用的方法一样准确得到。如果使用Windows 8,Server 2012或更高版本,则还可以使用GetSystemTimePreciseAsFileTime()来获得最高的支持精度。