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

cleanest way to do relative time-of-day comparisons in c++11

本文关键字:方法 比较 时间 c++11 相对      更新时间:2023-10-16

假设我有一个事件流,每个事件都有一个完整的时间戳,跨越许多天。我想将它们与一天中的时间进行比较,但无论哪一天。例如,如果给定的事件发生在12:00:00到12:05:00之间,那么就做一些事情,但与日期无关。

事件时间戳适合std::chrono::time_point对象。在std::chrono中进行这些比较的最惯用的方法是什么?有没有一个对象可以表示一天中的某个时间,而不是特定于某一天?我要自己卷吗?

你可以这样做:

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.
}

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

我不这么认为。但是实现起来应该很简单。将时间点转换为分解时间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 intervaln";
注意:gmtime()localtime()返回一个指向静态数据的指针,因此不是线程安全的。Linux(可能还有其他*nix)有线程安全的gmtime_r()localtime_r()