如何使用<time.h>计算两个日期之间的天数

时间:2019-04-28 15:27:08

标签: c time.h

我正在尝试编写一个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)));
}

1 个答案:

答案 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));

即使在太平洋地区的时区更改了国际日期线的哪一侧,而实际上又重复了一天还是取消了一天,这种情况也无法解决。


从好的方面来说,您发布的代码确实可以编译。