假设我有一系列事件,每个事件都有一个完整的时间戳,跨越多天。我想把它们与一天中的时间进行比较,但不管那一天。例如,如果某个特定事件发生在12:00:00和12:05:00之间,那就做一些事情,但不管当天。
事件时间戳自然适合作为std :: chrono :: time_point对象。 std :: chrono中进行这些比较的最惯用的方法是什么?是否有一个对象代表一个时间而不是特定于一天?我必须自己动手吗?
答案 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.
}