我想通过查看数据的时间戳来查看我的数据是否为120秒,所以我有以下代码:

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

在上面的代码中,data_holder->getTimestamp()uint64_t,它返回以毫秒为单位的时间戳。我上面的代码看起来正确吗?

最佳答案

我可能会做这样的事情:

auto now = system_clock::now().time_since_epoch();
// Use the correct time duration below. Milliseconds could be wrong, see 1)
auto diff = now - std::chrono::milliseconds(data_holder->getTimestamp());
bool is_old = diff > std::chrono::seconds{120};
// bool is_old = diff > 120s; // From C++14 onwards.

1)如前所述,milliseconds可能是用于getTimestamp()的错误单位。所有可能的类型是
std::chrono::hours
std::chrono::minutes
std::chrono::seconds
std::chrono::milliseconds
std::chrono::microseconds
std::chrono::nanoseconds

您可能必须尝试使用​​哪个,因为这取决于data_holder->getTimestamp()

注:大一号

确保使用system_clock来测量时间,因为纪元最有可能起作用。但是标准不要求时钟的纪元是UNIXt纪元的。您已经用steady_clock遇到了这个问题。

您必须自己计算时钟纪元与纪元之间的差(而且我不知道现在对任何时钟都这样做)。对于system_clock,如果您不信任它使用unix纪元,则可以使用以下命令:
system_clock::duration time_since_unix_epoch()
{
    std::tm epoch;
    epoch.tm_mday = 1;
    epoch.tm_mon = 0;
    epoch.tm_year = 70;
    std::time_t epocht = mktime(&epoch);
    return system_clock::now() - system_clock::from_time_t(epocht);
}

而不是system_clock::now()。我更喜欢这种方法。

不幸的是,您不能仅用system_clock中的另一个时钟替换std::chrono,因为只有std::system_clock提供了from_time_t(time_t),它可以将实际日期转换为时钟使用的内部time_point

关于c++ - 在C++中验证特定持续时间的时间戳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31550878/

10-17 01:41