簡體   English   中英

C計算日期之間的差異

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

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