Посмотрите, если метка времени находится между определенным часом

У меня много временных меток и данных, связанных с этим. Я хочу получить данные, которые были получены, скажем, с 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 для получения дополнительной информации.

Другие вопросы по тегам