Как получить оставшиеся секунды до указанного времени

Я ожидаю, что следующий метод вернет количество секунд, оставшихся до определенного времени в будущем в течение текущего дня. например, если текущее время «19:00», GetRemainedSeconds("19:01") должен вернуть 60, указывая, что 60 секунд осталось до заданного времени. призвание GetRemainedSeconds("18:59") должен вернуть -60. Проблема в том, что следующая функция показывает случайное поведение. Иногда он возвращает правильное значение, иногда нет (даже при запуске на той же машине). В чем проблема с этим кодом?

int GetRemainedSeconds ( const std::string &timeString, bool &isValid )
{
struct tm when;
char* p;

p = strptime ( timeString.c_str(), "%H:%M", &when );

if ( p == NULL || *p != '\0' )
{
std::cout << "Invalid 24h time format" << std::endl;
isValid = false;
return 0;
}

struct tm  now;

isValid = true;
time_t nowEpoch = time ( 0 ); // current epoch time

struct tm tmpTime;
now = *localtime_r ( &nowEpoch, &tmpTime );

when.tm_year = now.tm_year;
when.tm_mon = now.tm_mon;
when.tm_mday = now.tm_mday;
when.tm_zone = now.tm_zone;
when.tm_isdst = now.tm_isdst;
time_t whenEpoch = mktime ( &when );

return ( whenEpoch - nowEpoch );
}

0

Решение

Вам нужно установить when.tm_sec к чему-то (вероятно, ноль). Он содержит все ненужное, находящееся в стеке от предыдущего вызова, а это не то, что вам нужно.

И да, вы также должны установить when.tm_isdst к чему-то значимому.

2

Другие решения

Вот одна проблема:

when.tm_isdst = when.tm_isdst;

Вы устанавливаете when.tm_isdst к себе, что является просто неинициализированным мусором.

Я думаю, что вы хотели сказать:

when.tm_isdst = now.tm_isdst;
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector