2016-02-19 2 views
1

У меня есть это:же указываете ей() приводят к различным даты и времени строки

#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    struct tm timeinfo; 

    strptime("2016-02-18 09:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo); 
    printf("result 1=%ld\n", mktime(&timeinfo)); 

    strptime("2016-02-18 08:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo); 
    printf("result 2=%ld\n", mktime(&timeinfo)); 
} 

Результат для этого MCVE сводит меня с ума:

result 1=1455778800 
result 2=1455778800 

1455778800 время UTC для 2016-02-18 07:00:00 поэтому было бы правильно для второй строки даты. Но почему я получаю для двух разных строк один и тот же результат?

И теперь это:

{ 
    struct tm timeinfo; 

    strptime("2016-02-18 08:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo); 
    printf("result 2=%ld\n", mktime(&timeinfo)); 
    strptime("2016-02-18 09:00:00", "%Y-%m-%d %H:%M:%S", &timeinfo); 
    printf("result 1=%ld\n", mktime(&timeinfo)); 
} 

Вот у меня есть этот результат:

result 2=1455775200 
result 1=1455782400 

result 1 в настоящее время правильно, но result 2 на один час слишком рано. Похоже, что внутренние структуры glibc неправильно инициализируются, когда я вызываю это в первый раз.

Я связываю его с другой версией glibc, чем использует система. Когда я связываю его с версией системы, он работает. Что я сделал не так?

+0

Я не могу воспроизвести ваш результат, используя clang 700.1.81 на OS X. Я в другом часовом поясе от вас. Вы, кажется, в центральноевропейское время? Возможно, это может вызвать проблемы. Попробуйте 'timegm' вместо' mktime', чтобы исключить часовые пояса как возможность. Не могли бы вы подтвердить свой часовой пояс? Также вы должны распечатать '& timeinfo' вручную, чтобы проверить, не виноват ли' strptime' или 'mktime'. – Schwern

ответ

4

ОК, решение было в man страниц:

В принципе, эта функция не инициализирует тм, но сохраняет только значения, указанные. Это означает, что tm должен быть инициализирован
перед вызовом. Детали немного различаются между различными системами UNIX
. Реализация glibc не затрагивает те поля, которые
не указаны явно, за исключением того, что он перекомпонует tm_wday
и поле tm_yday, если изменились какие-либо элементы года, месяца или дня.

bzero(&timeinfo, sizeof(timeinfo)); и теперь это работает.

+0

или 'struct tm timeinfo = {0};' – chux

+0

@chux Я использую '-Wall -Wextra -Werror', и это не работает для' gcc'. Есть много «старых» структур, которые я должен инициализировать с помощью 'bzero()' –

+0

Множество способов для нулевых данных. 'bzero()' лучше, чем пытаться обнулить отдельные поля, поскольку общее количество полей 'struct tm' не определено. Хорошо, что это работает для вас. – chux

Смежные вопросы