【问题标题】:How to validate whether my data is x seconds old using chrono package?如何使用 chrono 包验证我的数据是否存在 x 秒?
【发布时间】:2015-07-26 21:21:28
【问题描述】:

我试图通过查看数据的时间戳来查看我的数据是否存在 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-&gt;getTimestamp() 是 uint64_t,它以毫秒为单位返回时间戳。

现在,当我打印出now 变量值时,我看到了这个433425679,当我打印出data_holder-&gt;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 命令构建库的方式不同?我正在使用生成 tar 文件的 cmake 命令构建我的项目可执行文件,然后通过解压缩 tar 文件来运行它。我在 Ubuntu 14.04 机器上运行。

之前,我在想我需要使用 system_clock 而不是 steady_clock,但在我从 main 方法运行它之后,似乎发生了其他事情。

【问题讨论】:

    标签: c++ c++11 timestamp chrono


    【解决方案1】:

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

    这意味着当您使用无符号变量执行now - data_holder-&gt;getTimestamp() 并且getTimestamp() 大于您的示例中的now 时,操作将换行并且您不会得到负值,而是(通常非常大)与输入相同的无符号整数类型之一。

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

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

    【讨论】:

    • 感谢您的帮助。我无法理解,所以您是说代码中存在导致此问题的问题?
    • @user1950349 你到底有什么不明白的?无符号整数算术部分?如果是这样,this 有帮助吗?
    • 不,我的意思是代码中是否有任何问题导致此问题或代码看起来正确?另外,为什么 main 方法有效,但当我从我的库项目中记录它时却无效。
    • @user1950349 我不明白你的 cmets。我解释了为什么您会得到不同的结果以及您当前的方法很可能是错误的,并且我提供了一个可行的替代方案。如果您需要对其中任何一个进行澄清或了解更多信息,请更具体。
    • @BaummitAugen 或者,找出另一个时钟的纪元是什么时候,然后从那个时间减去现在,然后将该增量时间转换为秒(或毫秒或分钟等)。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2021-02-14
    • 2012-08-14
    • 2014-09-03
    相关资源
    最近更新 更多