tm struct time.h не нормализуется

Я добавляю значения к элементам времени (часы, минуты, секунды) моей структуры tm, и они не обновляются/нормализуются, хотя я использую mktime() Вот код:

struct tm timeStruct;
char buffer[80];

timeStruct.tm_year = 2016 - 1900;
timeStruct.tm_mon = 3;
timeStruct.tm_mday = 32;
timeStruct.tm_hour = 23;
timeStruct.tm_min = 59;
timeStruct.tm_sec = 59;
timeStruct.tm_isdst = -1;

printf( "Date before adding interval: \n");
mktime(&timeStruct);
strftime(buffer, sizeof(buffer), "%c", &timeStruct);
printf(buffer);

printf( "\nthe year is %d\n", timeStruct.tm_year );
printf( "the month is %d\n", timeStruct.tm_mon );
printf( "the day is %d\n", timeStruct.tm_mday );
printf( "the hours are %d\n", timeStruct.tm_hour );
printf( "the minutes are %d\n", timeStruct.tm_min );
printf( "the seconds are %d\n", timeStruct.tm_sec );

/*
 * Add intervals to time
 */
timeStruct.tm_sec += 2;
timeStruct.tm_min += 2;
timeStruct.tm_hour += 5;

printf( "Date after adding interval: \n");
strftime(buffer, sizeof(buffer), "%c", &timeStruct);
printf(buffer);

printf( "\nthe year is %d\n", timeStruct.tm_year );
printf( "the month is %d\n", timeStruct.tm_mon );
printf( "the day is %d\n", timeStruct.tm_mday );
printf( "the hours are %d\n", timeStruct.tm_hour );
printf( "the minutes are %d\n", timeStruct.tm_min );
printf( "the seconds are %d\n", timeStruct.tm_sec );

Вывод в консоль:1

Это распечатка вывода консоли:

Date before adding interval: 
Mon May  2 23:59:59 2016
the year is 116
the month is 4
the day is 2
the hours are 23
the minutes are 59
the seconds are 59
Date after adding interval: 
Mon May  2 28:61:61 2016
the year is 116
the month is 4
the day is 2
the hours are 28
the minutes are 61
the seconds are 61

Я использую Eclipse, компилируемый с помощью Cygwin, на машине с Windows 7.


person Jay5    schedule 15.02.2016    source источник
comment
вы можете начать с чтения справочной страницы для strftime(), которая покажет, что используемая вами строка формата имеет проблемы. Укажите допустимую строку формата, и все должно пойти намного лучше. Обратите внимание, что для работы %c необходимо правильно установить локаль.   -  person user3629249    schedule 16.02.2016
comment
такой вызов printf() приведет к тому, что компилятор выдаст предупреждающее сообщение: printf(buffer); предложите использовать: printf("%s\n", buffer);   -  person user3629249    schedule 16.02.2016


Ответы (2)


В вашем коде mktime() вызывается только перед добавлением интервалов. Вам нужно вызвать его после добавления интервалов (чтобы он мог нормализовать обновленный timeStruct):

printf( "Date after adding interval: \n");
mktime(&timeStruct);    // <--- here
strftime(buffer, sizeof(buffer), "%c", &timeStruct);

Выход:

Tue May  3 05:02:01 2016
the year is 116
the month is 4
the day is 3
the hours are 5
the minutes are 2
the seconds are 1
person Yu Hao    schedule 15.02.2016

вот исправленный код:

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

struct tm timeStruct;
char buffer[80];

int main( void )
{
    timeStruct.tm_year = 2016 - 1900;
    timeStruct.tm_mon = 3;
    timeStruct.tm_mday = 32;
    timeStruct.tm_hour = 23;
    timeStruct.tm_min = 59;
    timeStruct.tm_sec = 59;
    timeStruct.tm_isdst = -1;

    printf( "Date before adding interval: \n");
    if( (time_t)-1 == mktime(&timeStruct) )
    {
        perror( "first call to mktime failed due to: ");
    }

    if( 0 == strftime(buffer, sizeof(buffer), "%c", &timeStruct) )
    {
        perror( "first call to strftime failed due to: ");
    }

    printf( "\n\n%s\n", buffer);

    printf( "\nthe year is %d\n", timeStruct.tm_year );
    printf( "the month is %d\n", timeStruct.tm_mon );
    printf( "the day is %d\n", timeStruct.tm_mday );
    printf( "the hours are %d\n", timeStruct.tm_hour );
    printf( "the minutes are %d\n", timeStruct.tm_min );
    printf( "the seconds are %d\n", timeStruct.tm_sec );

    /*
     * Add intervals to time
     */
    timeStruct.tm_sec += 2;
    timeStruct.tm_min += 2;
    timeStruct.tm_hour += 5;
    timeStruct.tm_year = 2016 - 1900;
    timeStruct.tm_mon = 3;
    timeStruct.tm_mday = 32;
    timeStruct.tm_hour = 23;
    timeStruct.tm_min = 59;
    timeStruct.tm_sec = 59;
    timeStruct.tm_isdst = -1;

    printf( "Date after adding first interval: \n");
    if( (time_t)-1 == mktime(&timeStruct) )
    {
        perror( "second call to mktime failed due to: ");
    }

    if( 0 == strftime(buffer, sizeof(buffer), "%c", &timeStruct) )
    {
        perror( "second call to strftime failed due to: ");
    }

    printf("\n\n%s\n", buffer);

    printf( "\nthe year is %d\n", timeStruct.tm_year );
    printf( "the month is %d\n", timeStruct.tm_mon );
    printf( "the day is %d\n", timeStruct.tm_mday );
    printf( "the hours are %d\n", timeStruct.tm_hour );
    printf( "the minutes are %d\n", timeStruct.tm_min );
    printf( "the seconds are %d\n", timeStruct.tm_sec );

    /*
     * Add intervals to time
     */
    timeStruct.tm_sec += 2;
    timeStruct.tm_min += 2;
    timeStruct.tm_hour += 5;

    printf( "Date after adding second interval: \n");
    if( (time_t)-1 == mktime(&timeStruct) )
    {
        perror( "third call to mktime failed due to: ");
    }

    if( 0 == strftime(buffer, sizeof(buffer), "%c", &timeStruct) )
    {
        perror( "third call to strftime failed due to: ");
    }

    printf("\n\n%s\n", buffer);

    printf( "\nthe year is %d\n", timeStruct.tm_year );
    printf( "the month is %d\n", timeStruct.tm_mon );
    printf( "the day is %d\n", timeStruct.tm_mday );
    printf( "the hours are %d\n", timeStruct.tm_hour );
    printf( "the minutes are %d\n", timeStruct.tm_min );
    printf( "the seconds are %d\n", timeStruct.tm_sec );
}

Вот текущий/исправленный вывод кода:

Date before adding interval: 


Mon May  2 23:59:59 2016

the year is 116
the month is 4
the day is 2
the hours are 23
the minutes are 59
the seconds are 59
Date after adding first interval: 


Mon May  2 23:59:59 2016

the year is 116
the month is 4
the day is 2
the hours are 23
the minutes are 59
the seconds are 59
Date after adding second interval: 


Tue May  3 05:02:01 2016

the year is 116
the month is 4
the day is 3
the hours are 5
the minutes are 2
the seconds are 1
person user3629249    schedule 16.02.2016