检查time_t是否在其他time_t之间,并有一些误差幅度
Checking if time_t is between other time_t with some margin of error
我有两个time_t变量:timeA 和 timeB。
我想做的是检查时间A是否与时间B相同。但是,我知道在某些情况下它们不会完全相同,并且它们之间可能会有 1 或 2 秒的差异,所以我真正想检查的是:
if (timeB - 2sec) <= timeA <= (timeB + 2sec)
可以这样做吗?
我想一种选择是不使用 time_t而是保留 timeB 作为 tm 结构,就在比较之前,减去两秒并创建一个time_t timeBminus,然后添加四秒并创建time_t timeBplus。问题是我将比较数百万个 timeA - timeB 对,并希望保持尽可能简单和快速。
我该怎么做?
像 -
if (std::fabs(std::difftime(timeA, timeB)) < 2.0)
(无法从这里检查确切的类型等,但我认为这个想法是正确的)
尽管
time_t
通常表示秒,但实际上它不是标准行为。time_t
的细节留给实施(据此)
与其直接使用 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;
}
if(abs(timeA - timeB) <= 2) {
// yay!
}
如果你的编译器支持 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()));
}
相关文章:
- 为什么在浮点中从大到小会引入更多的误差
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 解析某些行的文本和输出"time of appearance"
- 基于相邻元素 c++ 的分段误差范围的循环
- QImage::p ixel 和 QImage::setPixel 坐标超出范围误差
- 将误差线添加到 VTK 二维散点图
- 动态矩阵特征分解过程中的误差
- 返回time()库函数的数据类型
- 转换为非标量误差是什么意思?我该如何解决?
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 特征误差:INVALID_MATRIX_PRODUCT乘向量和矩阵
- 使用不同参数匹配器的同一方法ON_CALL AND EXPECT_CALL会产生饱和和活动误差
- boost odeint 中的受控误差步进器是否支持复杂的数据类型?
- 如何从 boost::p osix_time::p time 获取秒数
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- C++ SRAND(time(0)) 在猜谜游戏中不起作用
- 此外,在计算大斐波那契数时存在精度误差
- 即使包含 <time.h 后仍"‘CLOCK_PER_SEC’ was not declared in this scope"错误>
- struct TM time;vs TM time = {}.输出相同但不相同?