[英]How to count number of days between two dates using <time.h>
我正在嘗試編寫 ac 函數,該函數使用 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
成員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));
即使這樣也無法處理非常罕見的情況,即太平洋地區時區更改了它所在的國際日期變更線的哪一側,從而有效地重復或取消了一天。
從好的方面來說,您發布的代碼確實可以編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.