1

我正在尝试使用我自己的 Date 结构计算我给出的两个日期之间的确切差异,我现在正在测试返回差异的函数:

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 函数,因此我正在使用我在网上找到的知识来做这件事,这是我成功实现的最好的结果。

我究竟做错了什么?

4

3 回答 3

3

您遇到的两个问题是:

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
于 2015-01-20T15:41:01.457 回答
1

有人可能会认为,这是由

tA = tB = localtime(&rawtime);

然而,这只是事实的一半,因为将其分为

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

也会导致结果,即tA两者tB都指向同一个地址。这在localtime (man 3 localtime) 的手册页中有说明:“返回值指向一个静态分配的字符串,该字符串可能会被后续调用任何日期和时间函数所覆盖。”

因此,您必须将两者之一复制到新分配的struct tm.

于 2015-01-20T15:37:56.733 回答
1

tA和都tB应该使用 astruct 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);
    ...
}

代码可能还有另一个微妙的问题。假设下面是今天,有一个 off-by-1 错误

    tA.tm_mday = 20;
    // tA.tm_mon = 1;
    tA.tm_mon = 1 - 1;  // months since January
    tA.tm_year = 115;   // years since 1900
于 2015-01-20T15:38:28.453 回答