我有两个time_t变量:timeA和timeB。
我想要做的是检查timeA是否与timeB相同。但是,我知道在某些情况下它们不会完全相同,并且两者之间可能存在1或2秒的差异,因此我真正想要检查的是:
if (timeB - 2sec) <= timeA <= (timeB + 2sec)
有可能这样做吗?
我认为一个选项不是使用time_t而是将timeB保持为tm结构,并且在比较之前,减去两秒并创建time_t timeBminus然后添加四秒并创建time_t timeBplus。问题是我将比较几百万个时间A - 时间B对,并希望尽可能简单快速地保持它。
我该怎么做?
答案 0 :(得分:8)
像 -
if (std::fabs(std::difftime(timeA, timeB)) < 2.0)
(无法从这里检查确切类型等,但我认为这个想法是正确的)
答案 1 :(得分:2)
即使time_t
通常代表秒数,它实际上也不是标准行为。 time_t
的详细信息留待实施(根据this)
最好不要直接使用time_t
,而是使用struct timespec
并使用tv_sec
成员。检查它们是否相距2秒:
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;
}
答案 2 :(得分:1)
if(abs(timeA - timeB) <= 2) {
// yay!
}
答案 3 :(得分: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()));
}