Посмотрите, если метка времени находится между определенным часом
У меня много временных меток и данных, связанных с этим. Я хочу получить данные, которые были получены, скажем, с 0800 по 0900. Как проверить, находится ли временная метка между ними? Как мне написать функцию, которая вводит два часа и возвращает список временных меток, которые попадают в эти часы, независимо от того, какой сегодня день?
лайк
std::list<uint32_t> getTimestampsBetween(uint16_t min_hour, uint16_t max_hour)
{
if(timestamp from list of timestamp is between min_hour and max_hour)
add it to list;
return list;
}
2 ответа
Это зависит от формата временных меток, но если они time_t
, ты можешь использовать mktime
конвертировать данный tm
к time_t
, а также difftime
сравнить два time_t
, Что-то вроде:
bool
timeIsInInterval( time_t toTest, int minHour, int maxHour )
{
time_t now = time( NULL );
tm scratch = *localtime( &now );
scratch.tm_sec = scratch.tm_min = 0;
scratch.tm_hour = minHour;
time_t start = mktime( &scratch );
scratch.tm_hour = maxHour;
time_t finish = mktime( &scratch );
return difftime( toTest, start ) >= 0.0
&& difftime( toTest, finish ) < 0.0;
}
(На практике, toTest >= start && toTest < finish
вероятно достаточно. Хотя стандарт допускает гораздо больше, я не знаю ни одной реализации, где time_t
не является целочисленным типом, содержащим количество секунд с некоторой магической даты.)
Это предполагает, конечно, что вы ищете время между двумя часами сегодня. Если вам нужна произвольная дата, ее легко изменить. Если вы хотите любую дату, вам нужно сделать обратное: преобразовать метки времени в tm
и сравнить tm_hour
поля.
Использование localtime
преобразовать метку времени в struct tm
и проверьте, попадает ли атрибут tm_hour структуры в указанное окно. Посмотрите на time.h для получения дополнительной информации.