写一个函数返回最近的日期

时间:2018-04-21 05:55:34

标签: c pointers

任务:假设我有Tue, 27 Mar 2018 04:46:22 GMT格式的日期列表,我想查找给定列表的最新日期。我创建了一个比较每两个日期并输出最新日期的函数。

带有一些调试打印功能的

代码

char *max_time(char *t1, char *t2) {
    if (t1 == NULL && t2 == NULL) {
        fprintf(stderr, "t1, t2 are null");
        exit(1);
    }

    if (t1 == NULL) {
        return t2;
    } else if (t2 == NULL) {
        return t1;
    }


    printf("Incoming time1: %s, size: %zu\n", t1, strlen(t1));
    printf("Incoming time2: %s, size: %zu\n", t2, strlen(t2));

    struct tm tm1, tm2;
    time_t time1, time2;
    double diff;

    memset(&tm1, 0, sizeof(struct tm));
    memset(&tm2, 0, sizeof(struct tm));
    memset(&time1, 0, sizeof(time_t));
    memset(&time2, 0, sizeof(time_t));

    strptime(t1, "%a, %d %b %Y %X %Z", &tm1);
    strptime(t2, "%a, %d %b %Y %X %Z", &tm2);
    time1 = mktime(&tm1);
    time2 = mktime(&tm2);

    /* debug */
    char str1[50];
    char str2[50];
    strftime(str1, 50, "%a, %d %b %Y %X %Z", &tm1);
    strftime(str2, 50, "%a, %d %b %Y %X %Z", &tm2);
    printf("Time1: %s\n", str1);
    printf("Time2: %s\n", str2);
    /* end debugging */


    diff = difftime(time1, time2);
    printf("Time diff: %f\n", diff);
    if (diff > 0) {
        return t1;
    } else {
        return t2;
    }
}

用法

char *t1[] = {"Tue, 27 Mar 2018 04:46:22 GMT\r",
                  "Tue, 27 Mar 2018 04:47:46 GMT\r",
                  "Tue, 27 Mar 2018 04:57:17 GMT\r",
                  "Tue, 27 Mar 2018 04:49:31 GMT\r",
                  "Tue, 27 Mar 2018 04:48:46 GMT\r",
                  "Mon, 26 Mar 2018 03:44:55 GMT\r"};

    int i = 0;
    char *res = NULL;
    for(i = 0; i < 5; i++) {
        res = max_time(res, t1[i]);
        printf("Res: %s\n", res);
    }

它确实适用于示例案例,但在实际部署中它失败了。部分报告显示如下。

错误报告:部署输出,无法将char转换为时间戳 enter image description here

示例和实际部署之间的区别在于数据结构,日期数据存储在部署案例中的链表(list-&gt; date)中。根据报告,看起来我没有将char数组传递给strptime,如果这是真的,很可能在移动指针时我做错了。但我不确定它究竟发生在哪里。如果您有其他方法可以达到相同的结果,请随时发表评论。

1 个答案:

答案 0 :(得分:0)

第一个问题是memset(&amp; time1,0,sizeof(struct tm)); 但最终它会写入 diff str1 ,所以它不应该是问题的原因。

可是:

当您使用“人类”可读月份命名时,您应确保在prod和开发系统上将时间区域设置设置为相同。

尝试使用setlocale()函数检查它:

#include <locale.h>
printf("TS_LOCALE %s", setlocale(LC_TIME, NULL));

如果不同,只需将其设置为与开发机器上相同的值即可。