【发布时间】:2023-03-22 19:33:01
【问题描述】:
我有一个日期数组,目前是整数,格式为 {2010, 5, 13, 2010, 5, 15} 等等。我正在尝试使用 time.h 库来查找每个日期之间的天数差异。下面是一些描述出了什么问题的代码:
int main()
{
int dates[] = {2010, 4, 14, 2010, 4, 15, 2010, 4, 16};
int* pDates = dates;
printf("%d\n", subtractDates(1, pDates));
return 0;
}
int subtractDates(int i, int* pDates)
{
struct tm start_date;
struct tm end_date;
time_t start_time, end_time;
start_date.tm_hour = 0;
start_date.tm_min = 0;
start_date.tm_sec = 0;
start_date.tm_mon = *(pDates+1)-1;
start_date.tm_mday = *(pDates+2);
start_date.tm_year = *(pDates)-1900;
end_date.tm_hour = 0;
end_date.tm_min = 0;
end_date.tm_sec = 0;
end_date.tm_mon = *(pDates+1+i*3)-1;
end_date.tm_mday = *(pDates+2+i*3);
end_date.tm_year = *(pDates+i*3)-1900;
start_time = mktime(&start_date);
end_time = mktime(&end_date);
return difftime(end_time, start_time) / 86400;
}
此代码打印出提供的日期之间的差异是 1 天,这是正确的。但是,如果我删除数组中的第三个日期,如下所示,打印的值变为 0,我认为这是不正确的。
int main()
{
int dates[] = {2010, 4, 14, 2010, 4, 15};
int* pDates = dates;
printf("%d\n", subtractDates(1, pDates));
return 0;
}
int subtractDates(int i, int* pDates)
{
struct tm start_date;
struct tm end_date;
time_t start_time, end_time;
start_date.tm_hour = 0;
start_date.tm_min = 0;
start_date.tm_sec = 0;
start_date.tm_mon = *(pDates+1)-1;
start_date.tm_mday = *(pDates+2);
start_date.tm_year = *(pDates)-1900;
end_date.tm_hour = 0;
end_date.tm_min = 0;
end_date.tm_sec = 0;
end_date.tm_mon = *(pDates+1+i*3)-1;
end_date.tm_mday = *(pDates+2+i*3);
end_date.tm_year = *(pDates+i*3)-1900;
start_time = mktime(&start_date);
end_time = mktime(&end_date);
return difftime(end_time, start_time) / 86400;
}
考虑到我所做的只是删除数组中的三个值,而这三个值甚至没有在第一个程序中使用,我只是不明白为什么它返回 0。任何帮助将不胜感激,谢谢。
【问题讨论】:
-
你不应该用
%d打印doubles。 -
所以,幸好你只是用它来打印整数。
-
为我工作:ideone.com/lytPf4
-
您应该检查来自
mktime()的返回并填写tm_isdst成员,该成员当前正在传递给mktime()未初始化并包含垃圾。如果您不花一点时间检查它们是否真的有效,那么您就没有道德权利期望它们会起作用。 -
您正在使用
difftime,它返回一个双精度,而不是一个整数。请通过将 return 语句更改为return difftime(end_time, start_time) / 86400.0;、将函数的返回类型更改为double并将printf格式更改为"%f"来解决该问题
标签: c arrays date pointers time