gpt4 book ai didi

c - 如何使用 计算两个日期之间的天数

转载 作者:行者123 更新时间:2023-11-30 19:27:18 26 4
gpt4 key购买 nike

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

最佳答案

代码由于各种原因失败。

"2019-10-5"strtok(date, "-") 尝试修改的字符串文字。这会导致未定义的行为 (UB)。当然是段错误的原因。

而是使用void auxDate(struct tm *t, const char *date)并解析date而不尝试更改它。请参阅 strspn()strcspn()

<小时/>

mktime(&date1) 使用未完全分配的struct tm。使用 struct tm p = { 0 }; 初始化所有 struct tm 成员。否则,未初始化的成员可能会向 mktime() 提供错误值。

<小时/>

.tm_mon 是自 1 月以来的月份数。我希望在某个地方有 - 1

<小时/>

由于 difftime() 返回以秒为单位的差异,而目标是以天为单位的差异。缺少除以每天的秒数。

<小时/>

还有其他需要解决的极端情况,涉及夏令时和时区偏移的重新定义,这将使时差移动一个小时左右。

为了处理,代码可以使用中午的时间并将 DST 设置为 -1

p.tm_hour = 12;
p.tm_isdst = -1;

然后舍入除法:

days = round(difftime(...)/(24.0*60*60));

即使这样也无法处理非常罕见的情况,即太平洋地区时区改变了它所在的国际日期变更线的哪一侧,这实际上重复或取消了一天。

<小时/>

好的一面是,您发布的代码确实可以编译。

关于c - 如何使用 <time.h> 计算两个日期之间的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55891773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com