如何使用 chrono 包验证我的数据是否是 x 秒前的数据?

2024-01-20

我试图通过查看数据的时间戳来查看我的数据是否是 120 秒旧的,因此我的库项目中有以下小代码正在使用std::chrono包裹:

uint64_t now = duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count();
bool is_old = (120 * 1000 < (now - data_holder->getTimestamp()));

// some logging to print out above values
LOG4CXX_WARN(logger, "data logging, now: " << now << ", data holder timestamp: " << data_holder->getTimestamp() << ", is_old: " << is_old << ", difference: " << (now -         data_holder->getTimestamp()));

在上面的代码中data_holder->getTimestamp()是 uint64_t,它返回以毫秒为单位的时间戳。

现在当我打印出来时now变量值,我看到这个433425679当我打印出来时data_holder->getTimestamp()值为1437943796841现在和数据持有者时间戳的差异如下:18446742636199180454如下日志所示:

2015-07-26 13:49:56,850 WARN 0x7fd050bc9700 simple_process - data logging, now: 433425679 , data holder timestamp: 1437943796841 , is_old: 1 , difference: 18446742636199180454

现在,如果我转换数据持有者时间戳1437943796841使用纪元转换器,我看到这个:

Your time zone: 7/26/2015, 1:49:56 PM

与日志中显示的时间戳完全相同2015-07-26 13:49:56,850 WARN这意味着我的数据看起来不是 120 秒的旧数据。如果是,那为什么我会看到is_old值为 1?

现在,如果我运行这个简单的主程序,我会看到is_old返回 0 而不是 1:

#include <iostream>

int main ()
{

bool is_old = (120 * 1000 < (433425679 - 1437943796841));
std::cout<<"is_old: " << is_old << std::endl;
}

到底是怎么回事?为什么当我从 main 方法运行时它返回 0,而当我从项目中记录它时它返回 1。这是否意味着我运行主代码的方式与使用 cmake 命令构建库的方式不同?我正在使用 cmake 命令构建项目可执行文件,该命令生成一个 tar 文件,然后通过解压 tar 文件来运行它。我正在 Ubuntu 14.04 机器上运行。

早些时候,我想我需要使用system_clock代替steady_clock但是当我从 main 方法运行它之后,看起来好像发生了其他事情。


无符号整数算术定义为以 2^numBits 为模的算术。

这意味着当你这样做时now - data_holder->getTimestamp()与你的无符号变量和getTimestamp()大于now正如在您的示例中一样,操作将换行,您不会得到负值,而是得到与输入相同的无符号整数类型(通常很大)之一。

如果您改用文字,它们的类型将被签名,因此结果将为负数,如预期的那样。

现在是否从任何源和返回的值中减去一些时间戳steady_clock::now首先有意义的是另一个问题。它很可能不会。您应该将当前时间与从同一来源获得的一些创建时间进行比较(例如,两者都来自std::steady_clock) 反而。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 chrono 包验证我的数据是否是 x 秒前的数据? 的相关文章

随机推荐