getdate и ctime не работают должным образом - PullRequest
2 голосов
/ 21 июля 2011

Вот моя программа 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 ]

2 голосов
/ 21 июля 2011

Вы создали файл шаблона с указанием формата даты, который вы используете?

со страницы руководства:

Пользовательские шаблоны используются для анализа и интерпретации входной строки. Шаблоны представляют собой текстовые файлы, созданные пользователем и идентифицированные с помощью переменной среды 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 голос
/ 21 июля 2011

Из тонкого руководства :

struct tm *getdate(const char *string);

Функция getdate возвращает struct tm *, а не time_t.Вам повезло, что ваша программа не падает и не загорается.

Пожалуйста, включите больше флагов предупреждений для вашего компилятора, вы должны были увидеть что-то вроде этого:

предупреждение: инициализация делает целое число из указателя без приведения

о строке 9.

0 голосов
/ 16 сентября 2015

В 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

Человек 3 getdate он скажет вам:

Требования к макрокоманде тестирования возможностей для glibc (см. Feature_test_macros (7)):

   getdate():
       _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
   getdate_r():
       _GNU_SOURCE
...