尝试使用time.h库计算两个日期之间的差异

时间:2015-01-20 15:14:49

标签: c++ c time time.h

我试图使用我自己的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);
}

正如你所看到的,我给了两个手册中的一些手册号码。结构来测试它。 当我调试时,在" timeA"中得到完全相同的值。和" timeB"。 我并不熟悉time.h函数,因此我使用我在网上找到的知识来做这件事,这是我成功实现的最佳目标。

我做错了什么?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

有人可能会认为,这是由

引起的
tA = tB = localtime(&rawtime);

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

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

也导致结果,tAtB都指向同一地址。这在manpage of localtime (man 3 localtime)中说明:&#34;返回值指向静态分配的字符串,该字符串可能被后续调用任何日期和时间函数覆盖。&#34;

因此,您必须将其中一个复制到新分配的struct tm

答案 2 :(得分:1)

tAtB都应使用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