我试图了解如何找到自1970年1月1日00:00:00以来经过的纳秒数。
我在互联网上找不到任何有关如何执行此操作的示例(或解释了如何在不参考代码的情况下进行计算) 我正在Windows上使用C ++ 11。
答案 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
的精度不是很高。因此,您可能无法获得比几毫秒更准确的结果。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()来获得最高的支持精度。