繁体   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