存储时间戳以纳秒为单位c ++

Ben*_*sen 3 c++ time c++11 c++-chrono

我的目标是将时间戳存储在纳秒范围内.假设我有两台机器需要在任务完成的时间进行通信.

让我们只是为了问题,说他们是同步时钟.
机器A在完成后存储当地时间.机器B发送到A,此时它完成.机器A然后计算差异.

我的问题是,时差实际上可以达到60秒,但也可以降到.25ms.所以我需要以这样的方式存储时间,我可以处理两者,并计算时差.

由于纳秒时代以来的时间是如此之大,我认为我不能将其存储在我所知道的任何变量中.

你会如何解决这种情况?我当前的情况是,我可能(某种程度上)可以缩短从ns开始的时间到代表1分钟的时间,但我不知道该怎么做.

希望你能帮忙.

最好的祝福

vog*_*vog 6

只需使用64位整数,signed(int64_t)或unsigned(uint64_t),你就可以了.

64位空间真的很大.它不仅足以存储时间差异,甚至可以存储绝对时间值,通常以1970-01-01午夜以来的时间来衡量.

例如,现在1970-01-01以来的秒数大致为:

1492432621.123456789
Run Code Online (Sandbox Code Playgroud)

在纳秒内,这是:

1492432621123456789
Run Code Online (Sandbox Code Playgroud)

为了比较,最大的带符号64位整数值是:

9223372036854775807
Run Code Online (Sandbox Code Playgroud)

这大致相当于2262-04-12,这个日期你几乎肯定不会再活着了.

但是,如果您仍然担心软件运行超过两个世纪的可能性,在此期间不会得到改进,并且最终会崩溃,那么您应该使用无符号的 64位整数,这会给它一些更多世纪,或者你应该使用128位整数,这几乎肯定是安全的,直到宇宙死亡.请注意,所有现代64位体系结构(或)都支持 128位整数,因此您可以安全地使用它们,当然,除非您需要支持传统的32位系统.或16位系统.8位,有人吗?__int128unsigned __int128


How*_*ant 6

我建议使用std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>. 您可以使用类型别名使其变得更漂亮。例如:

template <class Duration>
    using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>;
using sys_nanoseconds = sys_time<std::chrono::nanoseconds>;

sys_nanoseconds now = std::chrono::system_clock::now();
Run Code Online (Sandbox Code Playgroud)

这使您获得与当前接受的答案 ( int64_t) 相同的范围,但增加了类型安全。Anint64_t可能表示时间点或持续时间。 sys_nanoseconds只能表示 a time_point,如果像持续时间一样使用,将导致编译时错误。

例如,将两个相加是一个编译时错误sys_nanoseconds。但你可以减去二sys_nanoseconds,得到的类型是std::chrono::nanoseconds

您的范围(上溢/下溢之前)将是:

1677-09-21 00:12:43.145224192 to 2262-04-11 23:47:16.854775807
Run Code Online (Sandbox Code Playgroud)

要以纳秒精度获得更大范围的价值值得怀疑,但可以在支持 128 位类型的平台上这样做:

using nano128 = std::chrono::duration<__int128_t, std::nano>;
using sys_nano = sys_time<nano128>;
Run Code Online (Sandbox Code Playgroud)

现在你的范围远远大于+/-宇宙年龄。

请注意,在某些平台上,std::chrono::system_clock::now()不会以纳秒的精度进行报告。因此,存储纳秒时间戳可能有点矫枉过正。然而,将上面的代码更改为您想要的任何单位是很简单的。

system_clock::now()据报道,在 macOS 上microseconds,其范围将是nanoseconds. 在 Windows 上system_clock::now()以 a 的 1/10 为单位进行报告microseconds

using win_sys_duration = std::chrono::duration<std::int64_t,
                                               std::ratio<1, 10'000'000>>;
using win_sys_time_point = sys_time<win_sys_duration>;
Run Code Online (Sandbox Code Playgroud)

关于海湾合作委员会的system_clock::now()报告nanoseconds