簡體   English   中英

如何使用計算兩個日期之間的天數<time.h>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM