2

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

4

3 回答 3

2

您是否创建了一个模板文件来指定您使用的日期格式?

从手册页:

用户提供的模板用于解析和解释输入字符串。模板是由用户创建并通过环境变量 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;
}
于 2011-07-21T18:09:11.547 回答
1

来自精美手册

struct tm *getdate(const char *string);

getdate函数返回 a struct tm *,而不是 a time_t。你很幸运,你的程序没有崩溃和着火。

请为您的编译器打开更多警告标志,您应该看到如下内容:

警告:初始化从没有强制转换的指针生成整数

关于第 9 行。

于 2011-07-21T18:56:23.353 回答
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
于 2015-09-16T03:01:50.530 回答