2013-12-06 3 views
1

Я хочу, чтобы добавить задержку второго времени в формате структуры «тм», так что я запускаю этот код:добавить задержки времени формат STRUCT «тм»

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

#define SEC_PER_DAY 86400 

#define SEC_PER_HR 3600 

#define SEC_PER_MIN 60 

int main(void) { 
    time_t  now; 
    time_t  time_delay; 
    struct tm *ts; 
    struct tm *ts_delay; 
    char  buf[140]; 
    char  buf_delay[140]; 
    now = time(NULL); 
    int delay =100; 

    ts_delay = localtime(&now); 

    printf("day = %d \n",ts_delay->tm_mday); 
    ts_delay->tm_mday += delay /SEC_PER_DAY; 
    printf("day = %d \n",ts_delay->tm_mday); 
    printf("hour = %d \n",ts_delay->tm_hour); 
    ts_delay->tm_hour += (delay%SEC_PER_DAY)/SEC_PER_HR; 
    printf("hour = %d \n",ts_delay->tm_hour); 
    printf("min = %d \n",ts_delay->tm_min); 
    ts_delay->tm_min += ((delay%SEC_PER_DAY)%SEC_PER_HR)/SEC_PER_MIN; 
    printf("min = %d \n",ts_delay->tm_min); 
    printf("sec = %d \n",ts_delay->tm_sec); 
    ts_delay->tm_sec += ((delay%SEC_PER_DAY)%SEC_PER_HR)%SEC_PER_MIN; 
    printf("sec = %d \n",ts_delay->tm_sec); 

    /* Format and print the time, "ddd yyyy-mm-dd hh:mm:ss zzz" */ 
    ts = localtime(&now); 


    strftime(buf, sizeof(buf), "%FT%T%z", ts); 
    strftime(buf_delay, sizeof(buf_delay), "%FT%T%z", ts_delay); 
    puts(buf); 
    puts(buf_delay); 
    return 0; 
} 

Результат:

day = 6 
day = 6 
hour = 4 
hour = 4 
min = 14 
min = 15 
sec = 24 
sec = 64 
2013-12-06T04:14:24-0600 ==> ts 
2013-12-06T04:14:24-0600 ==> ts_delay 

кажется, что задержка не добавляется к ts_delay !!

любой толчок правильном направлении было бы очень полезно THX

+0

Чувствуется, что было бы гораздо более прямолинейно добавить 'delay' в' now' напрямую, но для игры со секундами/днями и т. Д. – alk

ответ

3

Ваш struct tm * ts_delay получает перезаписаны 2. вызовом localtime() У вас есть этот код:

ts_delay = localtime(&now); 
... change ts_delay; 
ts = localtime(&now); 

Теперь localtime() возвращает указатель. Поэтому необходимо выделить некоторое хранилище, поэтому возвращаемое значение localtime может указывать на то, что значение имеет значение. Время выполнения будет выделять это хранилище в одном статическом буфере (возможно, в потоке) для результата localtime(). Таким образом, 2. call to localtime() перезапишет тот же буфер, на который указывает ts_delay.

Вместо этого скопируйте результат localtime() в хранилище, которым управляете самостоятельно, вместо использования указателя struct tm в единственный доступный буфер.

struct tm ts;  //not a pointer anymore 
struct tm ts_delay; 

ts_delay = *localtime(&now); //copy the returned struct 
... change ts_delay; 
ts = *localtime(&now); 

Или использовать getlocaltime_r если ваша платформа предоставляет ему, например,

localtime_r(&now, &ts);