将字符串时间转换为unix时间,反之亦然

时间:2015-11-29 15:40:40

标签: c++ unix-timestamp

我一直试图简单地转换字符串" 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

谁能告诉我我做错了什么?

2 个答案:

答案 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