我正在尝试编写一个c函数,该函数使用time.h计算两个日期(格式:yyyy-mm-dd)之间的天数。
从字符串中读取日期。 我不需要占几秒钟或几分钟。
我知道我可能需要使用difftime(),但是如何以这种格式使用它呢?
谢谢
这是我试图做的,但是我遇到了分割错误。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define CURRDATE "2019-10-5"
#define OTHER "2019-10-10"
void auxDate(struct tm *t, char *date)
{
struct tm p;
p.tm_year = atoi(strtok(date, "-")) - 1900;
p.tm_mon = atoi(strtok(date, "-"));
p.tm_mday = atoi(date);
*t = p;
}
int main()
{
struct tm date1, date2;
auxDate(&date1, CURRDATE);
auxDate(&date2, OTHER);
printf("%.0lf\n", difftime(mktime(&date1), mktime(&date2)));
}
答案 0 :(得分:0)
代码由于各种原因而失败。
"2019-10-5"
是strtok(date, "-")
试图修改的字符串文字。这会导致不确定的行为(UB)。当然是分割错误的原因。
使用void auxDate(struct tm *t, const char *date)
并解析date
而不尝试更改它。参见strspn()
和strcspn()
。
mktime(&date1)
使用未完全分配的struct tm
。用struct tm
初始化所有struct tm p = { 0 };
成员。否则,未初始化的成员可能会为mktime()
提供错误的值。
.tm_mon
是自一月开始的月份数。我希望某个地方有- 1
。
由于difftime()
以秒为单位返回差额,因此目标是以天为单位差。每天的秒数丢失了。
要解决的另一种极端情况涉及夏时制和时区偏移量的重新定义,这将使时差移动一个小时左右。
要处理,代码可以使用中午的时间并将DST设置为-1
p.tm_hour = 12;
p.tm_isdst = -1;
然后四舍五入:
days = round(difftime(...)/(24.0*60*60));
即使在太平洋地区的时区更改了国际日期线的哪一侧,而实际上又重复了一天还是取消了一天,这种情况也无法解决。
从好的方面来说,您发布的代码确实可以编译。