【问题标题】:getdate and ctime not working properlygetdate 和 ctime 无法正常工作
【发布时间】:2011-10-10 11:15:25
【问题描述】:

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

【问题讨论】:

  • 你在哪个平台上?我对getdate 的原型是struct tm *getdate(const char *string);

标签: c time ctime getdate


【解决方案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;
}

【讨论】:

  • 不检查getdate()的返回值吗?
【解决方案2】:

来自fine manual

struct tm *getdate(const char *string);

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

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

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

关于第 9 行。

【讨论】:

    【解决方案3】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 2016-12-01
      • 2017-02-17
      • 2021-08-02
      • 2013-08-01
      • 2017-05-16
      • 2016-11-26
      • 2014-08-19
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多