簡體   English   中英

檢查time_t是否在其他time_t之間,並且有一些誤差

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM