如何使用 chrono 包验证我的数据是否存在 x 秒?
How to validate whether my data is x seconds old using chrono package?
我试图通过查看数据的时间戳来查看我的数据是否存在 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 其中 returns 时间戳以毫秒为单位。
现在当我打印出 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 命令构建的方式不同?我正在使用生成 tar 文件的 cmake 命令构建我的项目可执行文件,然后我通过 untarring tar 文件来 运行ning 它。我正在 运行ning Ubuntu 14.04 box。
早些时候,我想我需要使用 system_clock
而不是 steady_clock
,但是在我从 main 方法 运行 之后,它看起来像其他事情正在发生。
无符号整数算术定义为算术模 2^numBits。
这意味着当您对无符号变量执行 now - data_holder->getTimestamp()
并且 getTimestamp()
大于 now
时,操作将换行并且您不会得到负值,但是一个(通常很大)与输入相同的无符号整数类型之一。
如果您改用文字,它们的类型将被签名,因此结果将如预期的那样为负数。
现在从任何源中减去一些时间戳和 steady_clock::now
返回的值是否首先有意义是一个不同的问题。它很可能没有。您应该将当前时间与您从同一来源获得的一些创建时间进行比较(例如,两者都来自 std::steady_clock
)。
我试图通过查看数据的时间戳来查看我的数据是否存在 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 其中 returns 时间戳以毫秒为单位。
现在当我打印出 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 命令构建的方式不同?我正在使用生成 tar 文件的 cmake 命令构建我的项目可执行文件,然后我通过 untarring tar 文件来 运行ning 它。我正在 运行ning Ubuntu 14.04 box。
早些时候,我想我需要使用 system_clock
而不是 steady_clock
,但是在我从 main 方法 运行 之后,它看起来像其他事情正在发生。
无符号整数算术定义为算术模 2^numBits。
这意味着当您对无符号变量执行 now - data_holder->getTimestamp()
并且 getTimestamp()
大于 now
时,操作将换行并且您不会得到负值,但是一个(通常很大)与输入相同的无符号整数类型之一。
如果您改用文字,它们的类型将被签名,因此结果将如预期的那样为负数。
现在从任何源中减去一些时间戳和 steady_clock::now
返回的值是否首先有意义是一个不同的问题。它很可能没有。您应该将当前时间与您从同一来源获得的一些创建时间进行比较(例如,两者都来自 std::steady_clock
)。