getdate和ctime无法正常工作

时间:2011-07-21 18:04:05

标签: c time ctime getdate

这是我的程序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。为什么会这样?

3 个答案:

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

必须在第一行添加以下代码:

#define _XOPEN_SOURCE 500

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