2015-01-20 2 views
1

Я пытаюсь вычислить точную разницу между двумя датами, которые я даю, используя мою собственную структуру даты. Теперь я тестирую функции, которые возвращают разницу:Попытка рассчитать разницу между двумя датами, используя библиотеку time.h

Date dateDifference(Date a, Date b){ 
    time_t rawtime,timeA,timeB; 
    struct tm* tA,*tB; 
    double difference; 

    time(&rawtime); 
    tA = tB = localtime(&rawtime); 

    tA->tm_mday = 20; 
    tA->tm_mon = 1; 
    tA->tm_year = 115; 

    tB->tm_mday = 3; 
    tB->tm_mon = 10; 
    tB->tm_year = 89; 

    timeA = mktime(tA); 
    timeB = mktime(tB); 

    difference = difftime(timeA, timeB); 
} 

Как вы можете видеть, я дал некоторые ручные номера в две структуры «tm», чтобы проверить его. Когда я отлаживаю, я получаю то же самое значение как в «timeA», так и «timeB». Я не очень хорошо знаком с функциями time.h, и поэтому я делаю это, используя знания, которые я нахожу в Интернете, и это лучшее, что я добился.

Что я делаю неправильно?

ответ

1

Можно подумать, что это вызвано

tA = tB = localtime(&rawtime); 

Однако, это только половина правды, потому что разделение это в

tA = localtime(&rawtime); 
tB = localtime(&rawtime); 

также приводит к результату, что tA и tB оба указывать на тот же адрес. Это указано в manpage of localtime (man 3 localtime): «Возвращаемое значение указывает на статически выделенную строку, которая может быть перезаписана последующими вызовами любой из функций даты и времени».

Следовательно, вам нужно скопировать один из двух в недавно выделенный struct tm.

1

Оба tA и tB должны использовать struct tm, а не указатель, как в struct tm *. Таким образом, у каждого из них есть своя собственная память для манипулирования.

Исходный код использовал указатели в том же месте памяти. Таким образом, изменение одного также изменило другое.

Date dateDifference(Date a, Date b){ 
    time_t rawtime,timeA,timeB; 
    // struct tm* tA,*tB; 
    struct tm tA, tB; 
    double difference; 

    time(&rawtime); 
    // tA = tB = localtime(&rawtime); 
    tA = tB = *localtime(&rawtime); 

    tA.tm_mday = 20; 
    tA.tm_mon = 1; 
    tA.tm_year = 115; 

    tB.tm_mday = 3; 
    tB.tm_mon = 10; 
    tB.tm_year = 89; 

    timeA = mktime(&tA); 
    timeB = mktime(&tB); 

    difference = difftime(timeA, timeB); 
    ... 
} 

У кода, вероятно, есть еще одна тонкая проблема. Предполагая следующее сегодняшний день, есть совсем по-1 ошибка

tA.tm_mday = 20; 
    // tA.tm_mon = 1; 
    tA.tm_mon = 1 - 1; // months since January 
    tA.tm_year = 115; // years since 1900 
+1

размеченный ошибки я пропустил. –

2

Две проблемы у вас есть следующие:

localtime() возвращает указатель на структуру в своей собственной статической памяти. Вы должны скопировать структуру, прежде чем снова позвонить localtime().

Вы не выделили какую-либо память для двух структур tm.Я изменил их с указателей на простые структуры.

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

int main() 
{ 
    time_t timeA, timeB; 
    struct tm tA, tB, *tptr; 
    double difference; 

    time(&timeA); 
    time(&timeB); 
    tptr = localtime(&timeA); 
    tA = *tptr; 
    tptr = localtime(&timeB); 
    tB = *tptr; 

    tA.tm_mday = 20; 
    tA.tm_mon = 1; 
    tA.tm_year = 115; 

    tB.tm_mday = 3; 
    tB.tm_mon = 10; 
    tB.tm_year = 89; 

    timeA = mktime(&tA); 
    timeB = mktime(&tB); 

    difference = difftime(timeA, timeB); 
    printf ("Difference is %.0f seconds\n", difference); 
    return 0; 
} 

выход программы:

Difference is 798336000 seconds