我一直试图简单地转换字符串" 1998-04-11"根据在线转换器,UNIX时间戳应为892245600。
但我不断得到不同的结果。
struct tm tm;
time_t ts;
strptime("1998-04-11", "%Y-%m-%d", &tm);
tm.tm_mon = tm.tm_mon -1;
ts = mktime(&tm);
printf("%d \n", (int)ts); //unix time-stamp
printf("%s \n", ctime(&ts)); //human readable date
结果:
893502901
Sat Apr 25 13:15:01 1998
谁能告诉我我做错了什么?
答案 0 :(得分:7)
在调用tm
strptime
结构归零
memset(&tm, 0, sizeof(struct tm));
来自http://man7.org/linux/man-pages/man3/strptime.3.html
的备注部分原则上,此功能不会初始化
tm
,而只会存储 指定的值。这意味着应该初始化tm
在通话之前。
memset
在同一页的示例中使用如上所述。
答案 1 :(得分:3)
这是未初始化内存的问题。
(gdb) p tm
$1 = {tm_sec = 1, tm_min = 0, tm_hour = 4196061, tm_mday = 0, tm_mon = -5984, tm_year = 32767,
tm_wday = 0, tm_yday = 0, tm_isdst = 4195984, tm_gmtoff = 4195616,
tm_zone = 0x7fffffffe980 "\001"}
正如您在调试器中看到的那样,struct tm
已分配随机内存。使time_zone偏移垃圾。
运行strptime
后:
(gdb) p tm
$3 = {tm_sec = 1, tm_min = 0, tm_hour = 4196061, tm_mday = 11, tm_mon = 3, tm_year = 98,
tm_wday = 6, tm_yday = 100, tm_isdst = 4195984, tm_gmtoff = 4195616,
tm_zone = 0x7fffffffe980 "\001"}
另外:
tm.tm_mon = tm.tm_mon -1;
没必要。更正后的代码:
#include <time.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
struct tm tm;
time_t ts = 0;
memset(&tm, 0, sizeof(tm));
strptime("1998-04-11", "%Y-%m-%d", &tm);
ts = mktime(&tm);
printf("%d \n", (int)ts); //unix time-stamp
printf("%s \n", ctime(&ts)); //human readable date
}
输出:
892252800
Sat Apr 11 00:00:00 1998