我试图使用我自己的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函数,因此我使用我在网上找到的知识来做这件事,这是我成功实现的最佳目标。
我做错了什么?
答案 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);
也导致结果,tA
和tB
都指向同一地址。这在manpage of localtime (man 3 localtime)中说明:&#34;返回值指向静态分配的字符串,该字符串可能被后续调用任何日期和时间函数覆盖。&#34;
因此,您必须将其中一个复制到新分配的struct tm
。
答案 2 :(得分: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