2014-02-05 4 views
1

Я использую VS2010 Этот код компилируется как ANSI C Projectне указываете ей обновить STRUCT тм

int C90Clockadapter_GetCW_ISO8601(const C90Clockadapter * clockadapter, int * calendarweek) 
{ 
    int e = 0; 
    struct tm tm; 
    char timebuf[64]; 

    memset(&tm, 0, sizeof(tm)); 
    tm.tm_mday = clockadapter->mDay; 
    tm.tm_mon = clockadapter->mMonth; 
    tm.tm_year = clockadapter->mYear; 

    mktime(&tm); 

    if (0 != strftime(timebuf,sizeof(timebuf),"%W", &tm)) //i know %W is not ISO8601 
    { 
     *calendarweek = atoi(timebuf); 
    } 
    else 
    { 
     e |= 1; 
    } 

    return e; 
} 

как-то mktime(&tm) не изменяет состояние tm. Такое поведение полностью не соответствует моим ожиданиям.

Я написал несколько UnitTests, которые имеют чувство собственного объясняющую выход:

4.1.1971 - expected CW 1 but was CW 0 
31.12.1992 - expected CW 53 but was CW 0 

Что случилось с моим кодом - или есть некоторые специальности в окнах или с VS2010 и ANSI-C, что мне не хватает?

ответ

0

TimeFormat недействителен. mktime возвращается -1, и это было необработанным.

Этот фрагмент показывает, как правильно заполнить struct tm.

tm.tm_mday = clockadapter->mDay; 
tm.tm_mon = clockadapter->mMonth - 1; 
tm.tm_year = clockadapter->mYear - 1900; 
1

В ссылках указывается, что необязательно изменить параметр timeptr. Вы должны использовать возвращаемое значение. См http://www.cplusplus.com/reference/ctime/mktime/

time_t mktime (struct tm * timeptr); 
Смежные вопросы