将时间戳存储在纳秒C 中
Store timestamps in nanoseconds c++
我的目标是将时间戳存储在纳秒范围内。假设我有两台需要进行交流的机器,正是在什么时候完成任务。
让我们只是为了这个问题,说它们是同步的时钟。
机器A完成后将其当地时间存储。机器B将其传输到A,此时完成。机器A然后计算差异。
我的问题是,定时差实际上可以长达60秒,但也可以降至.25ms。因此,我需要以这样的方式存储时间,以便我可以处理两者并计算定时差。
自从纳米秒时的时代以来,这是一个很大的数字,我认为我无法将其存储在我所知道的任何变量中。
您将如何解决这种情况?我目前的目前是,我可能(某种程度上(可以扩展自NS中的时代以来,但我不知道该怎么做。
。希望您能提供帮助。
最好的问候
只需使用64位整数,签名(int64_t
(或unsigned( uint64_t
(,您都可以很好。
64位的空间真的很大。它不仅足以存储时间差,而且还足以存储绝对时间值,通常将其作为自1970-01-01午夜以来的时间测量。
例如,现在自1970-01-01以来的秒数大致是:
1492432621.123456789
在纳米秒中,这是:
1492432621123456789
为了进行比较,最大的签名的64位整数值为:
9223372036854775807
这大约对应于2262-04-12,您几乎可以肯定不会再活着的日期。
但是,如果您仍然关心您的软件运行超过两个世纪的可能性,在此期间不会改善,最终将崩溃,那么您应该使用 unsigned 64位整数将为它提供更多的世纪,或者您应该使用128位整数,这些整数几乎可以肯定是安全的,直到宇宙去世为止。请注意,所有现代64位体系结构(__int128
或unsigned __int128
(都支持128位整数,因此您可以安全地使用它们,除非您当然需要支持Legacy 32位系统。或16位系统。8位,有人吗?
我建议使用 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();
这使您与当前接受的答案(int64_t
(相同,但添加了类型安全。int64_t
可能意味着时间点或时间持续时间。sys_nanoseconds
只能表示time_point
,如果使用时间持续时间,则会导致编译时间错误。
例如,将两个sys_nanoseconds
添加在一起是一个编译时错误。但是您可以减去两个sys_nanoseconds
,结果类型为std::chrono::nanoseconds
。
您的范围(在溢出/下流之前(将是:
1677-09-21 00:12:43.145224192 to 2262-04-11 23:47:16.854775807
以纳秒精度获得更大的范围是可疑的,但是可以在支持128位类型的平台上这样完成:
:using nano128 = std::chrono::duration<__int128_t, std::nano>;
using sys_nano = sys_time<nano128>;
现在您的范围远大于/-宇宙年龄。
请注意,在某些平台上,std::chrono::system_clock::now()
不会准确地报告纳秒。因此,存储纳秒时间戳可能过高。但是,使用上述代码并将其更改为您想要的任何单位是微不足道的。
在MacOS上,system_clock::now()
报告microseconds
,其范围为nanoseconds
的1000倍。在Windows system_clock::now()
上,microseconds
的1/10单位报告:
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>;
和在GCC上,system_clock::now()
报告nanoseconds
。
- C++:floor unix时间戳到UTC月份
- 如何在c++中录制具有精确帧时间戳的视频
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- 在多个时间戳处执行函数
- 以天C++为单位的两个时间戳之间的差异
- 获取 QInputEvent 在 Qt 4.8 中被放入 QEventLoop 队列时的时间戳
- 在 C++ 中为文件名添加时间戳
- 如何从远程 SFTP 服务器获取 HH-MM-SS 时间戳格式的文件列表
- 如何将消息时间戳写入日志文件?
- 将时间戳打印到流的最简单方法
- 读取悖论时间戳字段
- C++程序中多个位置的时间 (0) 时间戳
- C++-需要读取存储在文件(.txt)中的时间戳并正确检索
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 将时间戳存储在纳秒C 中
- 从数据文件中解析时间戳并存储在矢量中
- C++将修改后的MySQL时间戳存储为字符串
- 如何使用c++和PHP在客户端和云服务器之间正确存储时间戳和偏移量
- 如何在OMNeT++中存储不同时间戳的数据包