【问题标题】:How to count number of days between two dates using <time.h>如何使用 <time.h> 计算两个日期之间的天数
【发布时间】:2019-04-28 15:27:08
【问题描述】:

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

【问题讨论】:

  • 你是在支持 POSIX strptime()的平台上吗?
  • 你能发布你尝试过的东西吗?
  • 请发表您尝试过的事情,这里的人不会解决您的问题,他们会帮助您学习如何自己解决问题
  • 互联网上有一些开源程序可以做到这一点。也许查看他们的源代码将有助于为您提供一些想法。
  • 不,我不相信我的平台支持 strptime()。

标签: c time.h


【解决方案1】:

代码因各种原因失败。

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

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


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


.tm_mon一月以来的月份数。我希望在某个地方出现- 1


由于difftime() 返回以秒为单位的差异,目标是以天为单位的差异。没有按每天的秒数进行除法。


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

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

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

然后四舍五入:

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-26
    • 2010-10-07
    • 2015-02-26
    • 2019-09-27
    相关资源
    最近更新 更多