- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
持久化 std::chrono time_point 实例,然后将它们读回另一个相同类型的实例的正确方法是什么?
typedef std::chrono::time_point<std::chrono::high_resolution_clock> time_point_t;
time_point_t tp = std::chrono::high_resolution_clock::now();
serializer.write(tp);
.
.
.
time_point_t another_tp;
serializer.read(another_tp);
对写入/读取的调用,假设类型 time_point_t 的实例可以以某种方式转换为字节表示,然后可以写入或读取磁盘或套接字等。
Alf 建议的可能解决方案如下:
std::chrono::high_resolution_clock::time_point t0 = std::chrono::high_resolution_clock::now();
//Generate POD to write to disk
unsigned long long ns0 = t0.time_since_epoch().count();
//Read POD from disk and attempt to instantiate time_point
std::chrono::high_resolution_clock::duration d(ns0)
std::chrono::high_resolution_clock::time_point t1(d);
unsigned long long ns1 = t1.time_since_epoch().count();
if ((t0 != t1) || (ns0 != ns1))
{
std::cout << "Error time points don't match!\n";
}
<罢工>注意:上面的代码有一个bug,因为最终实例化的时间点与原来的不匹配。
在旧样式 time_t 的情况下,通常只是根据其 sizeof 将整个实体写入磁盘,然后以相同的方式将其读回 - 简而言之,与新的 std::chrono 类型等效的是什么?
最佳答案
从磁盘或套接字读取意味着您可能正在读取未执行写入的应用程序实例。而在这种情况下,仅序列化持续时间是不够的。
time_point
是自未指定时期以来的 duration
时间量。时代可以是任何东西。在我的计算机上, std::chrono::high_resolution_clock
的时代是计算机启动时。 IE。此时钟报告自启动以来的纳秒数。
如果一个应用程序写入 time_since_epoch().count(),计算机重新启动,然后另一个(或什至相同的)应用程序将其读回,则读入的值没有任何意义,除非你碰巧知道两次启动之间的时间量。
要可靠地序列化 time_point
,必须安排写入者和读取者就某个 epoch 达成一致,然后确保写入和读取的 time_point
是相互尊重的到那个时代。例如,可以安排使用 POSIX 纪元:New Years 1970 UTC。
事实证明,我知道的每个 std::chrono::system_clock
实现都使用 Unix time ,从 1970 年新年开始测量的 UTC 的近似值。但是我知道 std::chrono::high_resolution_clock
没有共同的时代。
只有当您能够以某种方式确保读取器和写入器时钟在一个共同的纪元上达成一致时,您才能将 time_point 序列化为持续时间。
关于c++ - 持久化 std::chrono time_point 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22291506/
boost::chrono::steady_clock::time_point 之间有什么区别?和 boost::chrono::time_point ,为什么不能相互转换? 这似乎非常多余。 最佳答
有没有什么优雅的方法可以将 boost chrono time_point 转换为标准库中的等价物? 最佳答案 恐怕你不能保证转换,除非你先验地接受 boost::chrono::steady_clo
我有一个变量存储为 long 来自 std::chrono::system_clock::time_point.time_since_epoch().count() 的值。我现在想从 long 变量中
如何将计时持续时间转换为时间点,该时间点晚于具有给定持续时间的时钟纪元?我试图在计时时钟中找到纪元时间,但没有成功。 最佳答案 来自 20.12.6 [time.point] 的概要: templat
我有一个用户提供的持续时间 const int period_seconds = cfg.period_seconds; 我想floor一个time_point到那个duration的粒度。 我看到
我有一个用户提供的持续时间 const int period_seconds = cfg.period_seconds; 我想floor一个time_point到那个duration的粒度。 我看到
给定两个分割值,自纪元以来的秒数和 µs,以下哪个更可取? auto timestamp = system_clock::time_point(seconds(time_seconds) + micr
我将 time_point 设置为下一个完整的五分钟,这很容易: template using minutes = std::chrono::duration, std::chrono::m
简单的问题,如何使用尽可能少的代码将 std::chrono::time_point 正确转换为 std::string? 注意:我不想将 cout 与 put_time() 一起使用。接受 C++1
我正在开发一个类 Timer它的一些成员属于 high_resolution_clock::time_point 类型其中 time_point定义为 typedef chrono::time_poi
我发现了以下问题。我有一个带时间的字符串(从我使用反向操作输出的文件中获取)。但是,当将其转换为 time_point 并将其输出到终端时,我发现相差一小时。我一直无法找出原因。有什么想法吗? #in
我不明白为什么这段代码会被 g++ 4.7.2 卡住: #include main () { std::chrono::system_clock::time_point t1, t2 ;
如果我有一个 std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now(); 变量,我如何定义另一个 time
我正在转换 std::chrono::time_point使用 的时间戳 std::chrono::duration_cast( getTimestamp().time_since_epoch()
如何仅更改现有 std::chrono::system_clock::time_point 的小时? 例如,假设我想实现这个功能: void set_hour(std::chrono::system_
如何仅更改现有 std::chrono::system_clock::time_point 的小时? 例如,假设我想实现这个功能: void set_hour(std::chrono::system_
如何从 std::chrono::system_clock::time_point 设置平台(windows、linux、android)的系统时间。 最佳答案 您不能使用 std::chrono 工
我在 12 天前发布了关于将 std::chrono::time_point 转换为字符串的问题并解决了问题。我想对你说声谢谢。 我使用以下代码解决了我的问题: char no[15]; string
我需要在 C++ 中获取当前日期和时间。我可以使用 chrono 来获取 系统时间 但我还需要将其作为字符串保存在 json 文件中。此外,我尝试过的计时时间格式如下: auto time = std
我对这些库还是很陌生,我可以在 std::chrono 上找到的文档对我不起作用。 我正在尝试实现一个包含时间戳的对象容器。这些对象都将按从最近到最不最近的顺序存储,我决定尝试使用 std::chro
我是一名优秀的程序员,十分优秀!