2016-09-14 38 views
0

我需要一个函数来计算两个日期时间(年,月,日,小时,分钟,秒)之间的差异。然后以相同的格式返回差异。计算C中的日期时间差异

int main(){ 

    struct datetime dt_from; 
    init_datetime(&dt_from, 1995, 9, 15, 10, 40, 15); 

    struct datetime dt_to; 
    init_datetime(&dt_to, 2004, 6, 15, 10, 40, 20); 

    struct datetime dt_res; 

    datetime_diff(&dt_from, &dt_to, &dt_res); 

    return 0; 

} 

void datetime_diff(struct datetime *dt_from, struct datetime *dt_to 
, struct datetime *dt_res) { 

    //What can I do here to calculate the difference, and get it in the dt_res? 

} 
+5

你的意思是这样的标准['difftime'](HTTP ://en.cppreference.com/w/c/chrono/difftime)函数? –

+0

struct datetime不可移植。您应该使用“time.h”库,因此您应该使用struct tm – jurhas

+0

1)struct datetime的后期定义。 2)'init_datetime()()'的发布定义3)描述代码如何处理溢出会很有用。 (最长时间 - 最短时间) – chux

回答

0

这里的基本思想是:

转换您datetime成代表你datetime值的整体式(优选long longunsigned long long),因为它是最小的单元(第二你的情况)。如何实现这一目标?轻松将单个值转换为秒,并将所有内容添加到一起。 (seconds + minutes * 60 + hours * 3600 ...

对两个值都执行此操作,然后减去整数值。

现在将单个整数值的时间差转换回datetime。怎么样?以最大单位(年)开始,并将差值除以一年内的秒数(60 * 60 * 24 * 365)。现在你知道你的两个datetime之间有多少年了。以休息和每月秒量除以它,等等...

(很显然,我忽略了一切相当复杂,如夏令时为例)


不过,我会强烈如评论中所述,推荐使用struct tmtime.h。它是便携式的,你可以使用difftime

0

请看看这个例子,它使用time.h,应该是可移植的。它会计算问题中日期之间的差异。您可以稍微更改一下程序,以便按照您的要求运行。

#include <stdio.h> 
#include <time.h> 
#include <math.h> 

int main() { 
    time_t start_daylight, start_standard, end_daylight, end_standard;; 
    struct tm start_date = {0}; 
    struct tm end_date = {0}; 
    double diff; 

    printf("Start date: "); 
    scanf("%d %d %d", &start_date.tm_mday, &start_date.tm_mon, &start_date.tm_year); 
    printf("End date: "); 
    scanf("%d %d %d", &end_date.tm_mday, &end_date.tm_mon, &end_date.tm_year); 

    /* first with standard time */ 
    start_date.tm_isdst = 0; 
    end_date.tm_isdst = 0; 
    start_standard = mktime(&start_date); 
    end_standard = mktime(&end_date); 
    diff = difftime(end_standard, start_standard); 

    printf("%.0f days difference\n", round(diff/(60.0 * 60 * 24))); 

    /* now with daylight time */ 
    start_date.tm_isdst = 1; 
    end_date.tm_isdst = 1; 
    start_daylight = mktime(&start_date); 
    end_daylight = mktime(&end_date); 
    diff = difftime(end_daylight, start_daylight); 

    printf("%.0f days difference\n", round(diff/(60.0 * 60 * 24))); 

    return 0; 
} 

测试

Start date: 15 9 1995 
End date: 15 6 2004 
3195 days difference 

甚至非交互代码和标准或夏令时简单:

#include <stdio.h> 
#include <time.h> 
#include <math.h> 
int main() 
{ 
    time_t start_daylight, start_standard, end_daylight, end_standard;; 
    struct tm start_date = {0}; 
    struct tm end_date = {0}; 
    double diff; 

    start_date.tm_year = 1995; 
    start_date.tm_mon = 9; 
    start_date.tm_mday = 15; 
    start_date.tm_hour = 10; 
    start_date.tm_min = 40; 
    start_date.tm_sec = 15; 

    end_date.tm_mday = 15; 
    end_date.tm_mon = 6; 
    end_date.tm_year = 2004; 
    end_date.tm_hour = 10; 
    end_date.tm_min = 40; 
    end_date.tm_sec = 20; 

    /* first with standard time */ 
    start_date.tm_isdst = 0; 
    end_date.tm_isdst = 0; 
    start_standard = mktime(&start_date); 
    end_standard = mktime(&end_date); 
    diff = difftime(end_standard, start_standard); 

    printf("%.0f days difference\n", round(diff/(60.0 * 60 * 24))); 

    /* now with daylight time */ 
    start_date.tm_isdst = 1; 
    end_date.tm_isdst = 1; 
    start_daylight = mktime(&start_date); 
    end_daylight = mktime(&end_date); 
    diff = difftime(end_daylight, start_daylight); 

    printf("%.0f days difference\n", round(diff/(60.0 * 60 * 24))); 

    return 0; 
} 
+1

您的代码在无效的用户输入上有未定义的行为。在任何示例代码中,这通常是一件坏事,人们可能会复制这些代码。 – hyde

+0

@hyde我应该添加错误检查吗? –

+1

'mktime()'读取除'tm_yday,tm_wday'之外的'struct tm'的所有​​字段。该代码只设置了其中的6个 - 缺少其他代码。用'struct tm start_date = {0}建议初始化;'设置所有字段并研究'tm_isdst'。 – chux