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