2013-11-18 11 views
0

Я пытаюсь дифф двух дат в C, но я получаю такой результат:C разница во времени

будущее Дата: 18-11-2013 22: 8

текущая дата: 18-11- 2013 22: 8

вот мой код:

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

int main(int argc, char *argv[]) 
{ 
    // 2 years ahead 
    time_t unixtime = time(NULL); 
    struct tm *future = localtime(&unixtime); 
    future->tm_year += 2; 

    // current time 
    time_t unixtime_now = time(NULL); 
    struct tm *current = localtime(&unixtime_now); 

    printf("future date: %d-%d-%d %d:%d\n", future->tm_mday, 1 + future->tm_mon, 1900 + future->tm_year, future->tm_hour, future->tm_min); 
    printf("current date: %d-%d-%d %d:%d\n", current->tm_mday, 1 + current->tm_mon, 1900 + current->tm_year, current->tm_hour, current->tm_min); 

    return 0; 
} 
+1

"но я получаю такой вывод:" - "but"? Но что? Что вы ожидаете вместо этого? –

ответ

2

это потому, что LocalTime() не возвратный.

Когда вы

struct tm *future = localtime(&unixtime); 
... 
struct tm *current = localtime(&unixtime_now); 

первый вызов возвращает указатель на некоторое статическое место под управлением во время выполнения. Второй вызов использует это же место для хранения данных. Так что теперь и future, и current указывают на то же самое.

Вам необходимо скопировать struct tm в хранилище, которое вы сами управляете: например.

struct tm future = *localtime(&unixtime); 
... 
struct tm current = *localtime(&unixtime_now); 

Или использовать более подходящую localtime_r функцию, если она доступна на вашей платформе.

struct tm future; 
localtime_r(&unixtime, &future); 
... 
struct tm current; 
localtime_r(&unixtime, &current); 
+0

'localtime_r' не является стандартным C. Возможно, это POSIX? В недавнем стандарте C, C11, есть новое дополнительное приложение K, в котором есть «localtime_s» с аналогичной функциональностью. –

2

Возвращаемое значение localtime представляет собой указатель на статический размещенные структуры, которые могут быть перезаписаны последующими вызовами функций даты/времени. Если вы хотите сохранить ориентированные данные дольше, вам нужно сделать его копию или использовать другую функцию, такую ​​как localtime_r.

Смотрите localtime(3) man page:

Функция LocalTime() преобразует время timep календарь на надломленный представление времени, выраженное относительно заданного часового пояса пользователя. Функция действует так, как если бы она называлась tzset (3), и устанавливает внешние переменные tzname с информацией о текущем часовом поясе, часовом поясе с разницей между скоординированным универсальным временем (UTC) и локальным стандартным временем в секундах, а дневной свет - ненулевым значением, если дневной свет правила экономии времени применяются в течение некоторой части года. Возвращаемое значение указывает на статически выделенную структуру, которая может быть перезаписана последующими вызовами любой из функций даты и времени. Функция localtime_r() делает то же самое, но сохраняет данные в предоставленной пользователем структуре. Не нужно устанавливать tzname, часовой пояс и дневной свет.

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