假设我有一个事件流,每个事件都有一个完整的时间戳,跨越许多天。我想把它们和一天中的时间进行比较,但不管一天是什么时候。例如,如果给定的事件发生在12:00到12:05:00之间,那么可以做一些事情,但不管是哪一天。
事件时间戳自然适合作为std::chrono::time_point对象。什么是std最惯用的方式::做这些比较的时间?是否有一个对象表示一天中的某一时间,而不是特定于一天?我要自己滚吗?
发布于 2014-08-03 08:53:50
你可以这样做:
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.
}
发布于 2014-08-03 08:53:07
是否有一个对象表示一天中的某一时间,而不是特定于一天?我要自己滚吗?
我不这样认为。但是它的实现应该是微不足道的。将时间点转换为分解时间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()
。
https://stackoverflow.com/questions/25106512
复制相似问题