как устранить ошибочное поведение mktime

Я пытаюсь преобразовать местное время в количество секунд с начала эпохи. Однако не похоже, что mktime() всегда возвращает одно и то же значение для одного и того же ввода.

Вот код:

int TimeCreated;
// ...
printf("%d/%d/%d %d:%d:%d\n",t.tm_year,t.tm_mon,t.tm_mday,t.tm_hour,t.tm_min,t.tm_c);
TimeCreated = mktime(&t);
printf("%d\n",TimeCreated);
printf("%d/%d/%d %d:%d:%d\n",t.tm_year,t.tm_mon,t.tm_mday,t.tm_hour,t.tm_min,t.tm_c);
TimeCreated = mktime(&t);
printf("%d\n",TimeCreated);

Кажется, что каждый раз, когда я запускаю проблему, вывод mktime() изменяется для одного и того же входного значения:

$ ./test1
115/2/28 15:29:1
1427581741
115/2/28 15:29:1
1427581741
$ test1
115/2/28 15:29:1
1427578141
115/2/28 14:29:1
1427578141

На странице руководства говорится: «Функции mktime() и timegm() преобразуют время разбивки (в структуре, на которую указывает *timeptr) в значение времени с той же кодировкой, что и значения, возвращаемые time(3) функция (то есть секунды от эпохи, UTC). Функция mktime() интерпретирует структуру ввода в соответствии с текущими настройками часового пояса (см. tzset (3))", что предполагает, что проблема связана с часовым поясом. Однако часовой пояс установлен правильно.

Если я извлеку только приведенный выше код из более крупной программы, частью которой он является, проблема исчезнет. Я подозреваю, что связывание и вызов функций в jhead может быть частью проблемы, но, читая страницу карты, я не могу представить, как это могло повлиять на результаты mktime().


person Michael    schedule 03.04.2015    source источник


Ответы (1)


Похоже, что поле tm_isdst в struct tm не инициализировано до первого вызова mktime(). Значение положительное, если действует летнее время, нулевое, если нет, и отрицательное, если информация недоступна.

person Mike Bessonov    schedule 03.04.2015
comment
вот так, спасибо! меньшая тестовая программа, по-видимому, находилась в другом месте стека, которое было нулевым. - person Michael; 04.04.2015