这是我的程序time_play.c:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int
main (void)
{
char *time_str = "2011-07-20 17:30:18";
time_t time_tm = getdate(time_str);
printf("str: %s and time: %s \n", time_str, ctime(&time_tm));
return 0;
}
它的输出:
$ gcc -o time_play time_play.c
$ ./time_play
str: 2011-07-20 17:30:18 and time: Wed Dec 31 16:00:00 1969
可以看出时间值为NULL。为什么会这样?
答案 0 :(得分:1)
您是否创建了指定所用日期格式的模板文件?
从手册页:
用户提供的模板用于解析和解释输入字符串。模板是由用户创建并通过环境变量DATEMSK识别的文本文件。
创建一个类似timetemplate.txt的文件:
%Y-%m-%d %H:%M:%S
然后将DATEMSK的值设置为指向它:
export DATEMSK=/home/somebody/timetemplate.txt
此代码在OS X上与我一起使用,并结合设置DATEMSK:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main (void)
{
char *time_str = "2011-07-20 17:30:18";
struct tm *time_tm = getdate(time_str);
time_t t = mktime(time_tm);
printf("str: %s and time: %s", time_str, ctime(&t));
return 0;
}
答案 1 :(得分:1)
来自fine manual:
struct tm *getdate(const char *string);
getdate
函数返回struct tm *
,而不是time_t
。你很幸运,你的程序没有摔倒并着火。
请打开编译器的更多警告标志,你应该看到这样的事情:
警告:初始化从指针生成整数而没有强制转换
关于第9行。
答案 2 :(得分:0)
在openSUSE 13.2中,
必须在第一行添加以下代码:
glibc的功能测试宏要求(参见feature_test_macros(7)):
getdate():
_XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
getdate_r():
_GNU_SOURCE
man 3 getdate它会告诉你:
glibc的功能测试宏要求(参见feature_test_macros(7)):
getdate():
_XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
getdate_r():
_GNU_SOURCE