Неожиданное значение возвращено из mktime()

Готовлю следующую структуру:

struct tm tDepartureTime;
tDepartureTime.tm_min = 24;
tDepartureTime.tm_hour = 13;
tDepartureTime.tm_mday = 11;
tDepartureTime.tm_mon = 2 - 1;
tDepartureTime.tm_year = 2017 - 1900;

затем я использую mktime(), чтобы получить количество секунд.

unsigned long qTime = mktime( &tDepartureTime );

но он возвращает мне номер 1731157832, который эквивалентен отметке времени для 09.11.2024. Где может быть проблема?


person Community    schedule 16.12.2016    source источник
comment
Вы предполагали, что дата будет в феврале 2017 года? (Значения tm_mon варьируются от 0 для января до 11 для декабря.)   -  person Jonathan Leffler    schedule 17.12.2016
comment
@JonathanLeffler, да Джонатан, это было предназначено для февраля. В любом случае спасибо, что сообщили мне.   -  person    schedule 18.12.2016
comment
ХОРОШО. Поскольку вы написали 2017 - 1900, но не написали 2 - 1, я не был уверен, но это не повлияло существенно на ваш вопрос.   -  person Jonathan Leffler    schedule 18.12.2016


Ответы (1)


Некоторые поля вашей структуры tm не инициализированы. В частности, это tm_sec, tm_mday, tm_wday, tm_yday и tm_isdst.

Из них нужно вручную установить, как минимум, tm_sec. Если его значение случайным образом оказывается очень высоким, это объясняет время в далеком будущем.

Вы также можете инициализировать всю структуру нулями, изменив первую строку на struct tm tDepartureTime = {0}. Это, пожалуй, лучшее решение.

person Bart van Nierop    schedule 16.12.2016
comment
Значения tm_wday, tm_yday не имеют значения и устанавливаются как побочный эффект вызова mktime(). Значение было установлено для tm_mday. Как вы правильно сказали, значение в tm_sec не было установлено, а реально присутствующее значение, вероятно, было довольно большим. - person Jonathan Leffler; 17.12.2016