任务:假设我有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);
}
它确实适用于示例案例,但在实际部署中它失败了。部分报告显示如下。
示例和实际部署之间的区别在于数据结构,日期数据存储在部署案例中的链表(list-&gt; date)中。根据报告,看起来我没有将char数组传递给strptime
,如果这是真的,很可能在移动指针时我做错了。但我不确定它究竟发生在哪里。如果您有其他方法可以达到相同的结果,请随时发表评论。
答案 0 :(得分:0)
第一个问题是memset(&amp; time1,0,sizeof(struct tm)); 但最终它会写入 diff 和 str1 ,所以它不应该是问题的原因。
可是:
当您使用“人类”可读月份命名时,您应确保在prod和开发系统上将时间区域设置设置为相同。
尝试使用setlocale()函数检查它:
#include <locale.h>
printf("TS_LOCALE %s", setlocale(LC_TIME, NULL));
如果不同,只需将其设置为与开发机器上相同的值即可。