在c ++ 11中进行相对时间比较的最干净的方法

时间:2014-08-03 16:05:53

标签: c++ chrono

假设我有一系列事件,每个事件都有一个完整的时间戳,跨越多天。我想把它们与一天中的时间进行比较,但不管那一天。例如,如果某个特定事件发生在12:00:00和12:05:00之间,那就做一些事情,但不管当天。

事件时间戳自然适合作为std :: chrono :: time_point对象。 std :: chrono中进行这些比较的最惯用的方法是什么?是否有一个对象代表一个时间而不是特定于一天?我必须自己动手吗?

2 个答案:

答案 0 :(得分:1)

  

是否有一个对象表示一天中的某个时间而不是特定于一天?我必须自己动手吗?

我不这么认为。但实施起来应该是微不足道的。将时间点转换为细分时间std::tm,然后检查各个成员。

#include <chrono>
#include <ctime>    // struct tm, gmtime()

using std::chrono::system_clock;

std::time_t ts = system_clock::to_time_t (system_clock::now());
std::tm& time = *gmtime (&ts);  // or localtime()

if (time.tm_hour==12 and time.tm_min>=0 and time.tm_min<5)
    cout << "Inside interval\n";

注意:gmtime()localtime()会返回指向静态数据的指针,因此是线程安全的。 Linux(可能还有其他* nix)具有线程安全gmtime_r()localtime_r()

答案 1 :(得分:1)

您可以执行以下操作:

auto timePoint = std::chrono::system_clock::now();
std::time_t t = std::chrono::system_clock::to_time_t(timePoint);
auto ltime = std::localtime(&t); // or gmtime.
auto eventTime = std::chrono::hours(ltime->tm_hour)
    + std::chrono::minutes(ltime->tm_min);

auto lower_bound = std::chrono::hours(12) + std::chrono::minutes(0);
auto upper_bound = std::chrono::hours(12) + std::chrono::minutes(5);

if (lower_bound <= eventTime && eventTime <= upper_bound) {
    // Do some action.
}