[英]Checking if time_t is between other time_t with some margin of error
我有兩個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對,並希望盡可能簡單快速地保持它。
我該怎么做?
就像是 -
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(ba) < 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()));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.