我有以下代码:
#include <stdio.h>
#include <string.h>
#include <time.h>
time_t make_time(char *input, char *hs) {
struct tm t;
char d[17];
strcpy(d, input);
strcat(d, hs);
d[16] = '\0';
strptime(d, "%m%d%Y%H:%M:%S", &t);
printf("data: %s", asctime(&t));
return mktime(&t);
}
void main(int argc, char *argv[]) {
char *s = argv[1];
char *e = argv[2];
time_t now = time(NULL);
time_t start = make_time(s, "00:00:00");
time_t end = make_time(e, "23:59:59");
int s1 = difftime(now, start);
int s2 = difftime(end, now);
int ret = 0;
if (s1 > 0 && s2 > 0) {
ret = 1;
}
printf("Result:\nInput: %s %s\nDiff: start: %d; end: %d\nret: %d\n", s, e, s1, s2, ret);
printf("\n");
}
构建了 2 个版本。一个用于 debian linux,另一个用于 arm 设备。
在 debian linux 上,结果看起来是正确的:
devbox@debian:~$ ./a.out 11182015 11302015
data: Wed Nov 18 00:00:00 2015
data: Mon Nov 30 23:59:59 2015
Result:
Input: 11182015 11302015
diff: start: 665291; end: 457908
ret: 1
但是在 armv7l env 上,strptime()
产生了错误的结果:
# /tmp/a.out 11182015 11302015
data: ??? Jan 8 ??:??:?? 1900
data: ??? Jan 8 ??:??:?? 1900
Result:
Input: 11182015 11302015
diff: start: 1448437831; end: -1448437831
ret: 0
armv7l上的strptime有问题还是不是标准的GNU C方法?
更新
这是 uname
命令的结果:
# uname -a
Linux buildroot 3.1.0-xg3517-1.1 #1 Tue Mar 12 12:54:57 JST 2013 armv7l GNU/Linux
最佳答案
我终于知道为什么并让它起作用了。问题是:strptime()
似乎不知道如何解析以下格式:
"%m%d%Y%H:%M:%S"
// or
"%m%d%Y %H:%M:%S"
// or
"%m/%d/%Y %H:%M:%S"
但是,如果我使用这个:"%m-%d-%Y %T"
strptime(d, "%m-%d-%Y %T", &t);
然后就成功了,太可惜了!
我不知道为什么这些格式不被接受,因为 doc 没有说明那些没有被完全实现的格式。无论如何,如果有人知道原因,请告诉我一些信息。
关于c - strptime() 在 armv7l 环境中产生错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33911371/