如何找到自 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() 可以用来代替获得支持的最高精度。
我试图了解如何找到自 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() 可以用来代替获得支持的最高精度。