Я ожидаю, что следующий метод вернет количество секунд, оставшихся до определенного времени в будущем в течение текущего дня. например, если текущее время «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 );
}
Вам нужно установить when.tm_sec
к чему-то (вероятно, ноль). Он содержит все ненужное, находящееся в стеке от предыдущего вызова, а это не то, что вам нужно.
И да, вы также должны установить when.tm_isdst
к чему-то значимому.
Вот одна проблема:
when.tm_isdst = when.tm_isdst;
Вы устанавливаете when.tm_isdst
к себе, что является просто неинициализированным мусором.
Я думаю, что вы хотели сказать:
when.tm_isdst = now.tm_isdst;