3

我有两个 time_t 变量:timeA 和 timeB。

我想要做的是检查 timeA 是否与 timeB 相同。但是,我知道在某些情况下它们不会完全相同,并且它们两者之间可能存在 1 或 2 秒的差异,所以我真正想要检查的是:

    if (timeB - 2sec) <= timeA <= (timeB + 2sec)

有可能这样做吗?

我想一种选择是不使用 time_t,而是将 timeB 保留为 tm 结构,并且在比较之前,减去两秒并创建 time_t timeBminus,然后添加四秒并创建 time_t timeBplus。问题是我将比较几百万个 timeA - timeB 对,并希望它尽可能简单和快速。

我该怎么做?

4

4 回答 4

8

就像是 -

if (std::fabs(std::difftime(timeA, timeB)) < 2.0) 

(无法从这里检查确切的类型等,但我认为这个想法是正确的)

于 2012-06-01T14:46:51.027 回答
2

尽管time_t通常代表秒,但实际上它不是标准行为。的细节time_t留待实现(根据this

与其time_t直接使用s,不如使用struct timespec和使用tv_secmember。要检查它们是否彼此相距 2s:

static inline bool close_enough(struct timespec &ts1, struct timespec &ts2)
{
    const int64_t sec_in_nsec = 1000000000ll;
    int64_t ts1_nsec = ts1.tv_sec * sec_in_nsec + ts1.tv_nsec;
    int64_t ts2_nsec = ts2.tv_sec * sec_in_nsec + ts2.tv_nsec;

    return ts1_nsec >= ts2_nsec - 2 * sec_in_nsec && ts1_nsec <= ts2_nsec + 2 * sec_in_nsec;
}

或在if. 函数调用将被优化掉,所以不用担心。按照其他答案中的建议使用abs很好,即使它将整数转换为浮点并执行浮点运算。

更新

使用time_t,您可以使用difftime获得两次之间的差异。再次:

static inline bool close_enough(time_t &t1, time_t &t2)
{
    double d = difftime(t1, t2);
    return d >= -2 && d <= 2;
}
于 2012-06-01T14:58:21.180 回答
1
if(abs(timeA - timeB) <= 2) {
  // yay!
}
于 2012-06-01T14:46:55.850 回答
1

如果你的编译器支持 c++11,你应该使用 chrono 而不是 ctime:

#include <iostream>
#include <chrono>
#include <tuple>

int main() {
    std::chrono::system_clock::time_point a,b;

    std::tie(a,b) = std::minmax(a,b);
    if ((b-a) < std::chrono::seconds(2)) {

    }
}

这样你就知道时间之间的差异实际上小于 2,而不是简单的 2 个时钟滴答,其中滴答不一定是秒。

不幸的是,时钟持续时间没有 std::abs ,或者您只需编写if (std::abs(b-a) < std::chrono::seconds(2)),尽管编写自己的代码很容易:

template<typename Rep,typename Period>
std::chrono::duration<Rep,Period> abs(std::chrono::duration<Rep,Period> d)
{
  return std::chrono::duration<Rep,Period>(std::abs(d.count()));
}
于 2012-06-01T15:02:49.467 回答