[英]C calculate difference between dates
我一直在尋找很多有關如何使用C獲取兩個日期之間月份差異的方法,但我一直無法解決。 因此,我認為我從簡單開始就可以理解它並從那里開始。
從我看到的一些示例中可以計算兩個日期之間的小時數,這是我想出的代碼:
#define _XOPEN_SOURCE
#include <time.h>
#include <stdio.h>
int main()
{
char *time1 = "2015-08-10";
char *time2 = "2017-05-16";
struct tm tm1;
struct tm tm2;
time_t t1;
time_t t2;
double hours;
strptime(time1, "%Y-%m-%d", &tm1);
strptime(time2, "%Y-%m-%d", &tm2);
printf("time1: %s\n", time1);
printf("tm1.year: %d\n", tm1.tm_year);
printf("tm1.mon : %d\n", tm1.tm_mon);
printf("tm1.day : %d\n", tm1.tm_mday);
printf("time2: %s\n", time2);
printf("tm2.year: %d\n", tm2.tm_year);
printf("tm2.mon : %d\n", tm2.tm_mon);
printf("tm2.day : %d\n", tm2.tm_mday);
t1 = mktime(&tm1);
t2 = mktime(&tm2);
hours = difftime(t2, t1) / 60 / 60;
printf("diff: %lf\n", hours);
return 0;
}
它可以編譯並運行,但是每次執行時都會給我不同的時間? 不明白為什么?
編譯:
$ gcc -Wall main.c -o timespan
和處決:
$ ./timespan
time1: 2015-08-10
tm1.year: 115
tm1.mon : 7
tm1.day : 10
time2: 2017-05-16
tm2.year: 117
tm2.mon : 4
tm2.day : 16
diff: -1885271229.700556
$ ./timespan
time1: 2015-08-10
tm1.year: 115
tm1.mon : 7
tm1.day : 10
time2: 2017-05-16
tm2.year: 117
tm2.mon : 4
tm2.day : 16
diff: -652404645.977222
您正在閱讀的字符串沒有時間成分,因此這些字段不是由strptime
設置的。
從手冊頁 :
筆記
原則上,此函數不初始化tm,而僅存儲指定的值。 這意味着應該在調用之前初始化tm。 不同的UNIX系統之間的細節有些不同。 glibc實現不涉及那些未明確指定的字段,除非在更改年,月或日元素中的任何一個時,它會重新計算tm_wday和tm_yday字段。
然后,當您調用mktime
,它將讀取那些未初始化的字段,從而調用未定義的行為 。
您需要初始化以下結構:
struct tm tm1 = {0};
struct tm tm2 = {0};
然后,您將獲得一致的結果:
time1: 2015-08-10
tm1.year: 115
tm1.mon : 7
tm1.day : 10
time2: 2017-05-16
tm2.year: 117
tm2.mon : 4
tm2.day : 16
diff: 15480.000000
另外,對於打印double
類型的值,請使用%f
格式說明符。 %lf
有效,但無效。
感謝您的所有幫助。 我設法解決了最初的問題(以月為單位),對於那些感興趣的人來說,這就是產品。
#define _XOPEN_SOURCE 800
#include <time.h>
#include <stdio.h>
struct date_stamp {
int yer;
int mon;
int day;
int hrs;
int min;
int sec;
};
int main()
{
char *time1 = "2015-08-10";
char *time2 = "2016-08-10";
struct tm tm1 = {0}; /* tm structs need to be initialized */
struct tm tm2 = {0};
struct date_stamp diff_date;
time_t t1;
time_t t2;
double diff;
/* convert the time strings into tm structs */
strptime(time1, "%Y-%m-%d", &tm1);
strptime(time2, "%Y-%m-%d", &tm2);
/* make the time_t variables*/
t1 = mktime(&tm1);
t2 = mktime(&tm2);
/* calculate the diffrence in seconds */
diff = difftime(t2, t1);
/*
* appearently there goes 2629746 seconds
* in one gregorian month
*/
diff_date.sec = diff;
diff_date.min = diff / 60;
diff_date.hrs = diff / 60 / 60;
diff_date.day = diff / 60 / 60 / 24;
diff_date.mon = diff / 2629746;
diff_date.yer = diff / 60 / 60 / 24 / 365;
printf("start : %s\n", time1);
printf("end : %s\n", time2);
puts( "-------+-----------");
printf("Year : %d\n", diff_date.yer);
printf("Months : %d\n", diff_date.mon);
printf("Days : %d\n", diff_date.day);
printf("Hours : %d\n", diff_date.hrs);
printf("Minutes: %d\n", diff_date.min);
printf("Seconds: %d\n", diff_date.sec);
return 0;
}
不要以為計算是堅如磐石的(一年366天?!?)。 但是我稍后會進行調整,至少我有一個基礎可以建立。
$ gcc -Wall main.c -o timespan
$ ./timespan
start : 2015-08-10
end : 2016-08-10
-------+-----------
Year : 1
Months : 12
Days : 366
Hours : 8784
Minutes: 527040
Seconds: 31622400
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.