2016-12-28 3 views
1

Я пытаюсь понять, что ниже заявление делает:Как используется функция localtime()?

tmptr = localtime(&t); 

Полный код:

main() { 
    char dateString[20], timeString[20]; 
    struct tm *tmptr; 
    time_t t; 
    t = time(NULL); 
    tmptr = localtime(&t); 
    strftime(dateString, 20, "%F",tmptr) 
    printf("%s %s\n",dateString,timeString); 
} 

Я понимаю, что функция time(NULL) дает время в секундах от UNIX эпохи. Но я не понимаю, почему:

  1. NULL принят в time()? Что делать, если я передаю ненулевое значение? Я не мог понять эту страницу.
  2. Что здесь делает localtime()?
+0

Спасибо @Stargateur – Doherty

+0

Вы только спрашиваете о стандартных функциях C. Почему так много тегов? Особенно, где может попасть в игру какой-нибудь материал linux-kernel? – Gerhardh

+1

Извините @ Герхад. Я скорректировал теги сейчас. – Doherty

ответ

2

Человек страница совершенно ясно, о том, что параметр:

time_t time(time_t *t); 

...

t Если это не- NULL, возвращаемое значение также сохраняется в памяти остроконечный до t.

Это означает, что вы можете использовать его как это:

time t; 
t = time(NULL); 

или как это:

time t; 
time(&t); 

Как правильно распознан результат в т есть число секунд с начала эпохи , Если вы хотите получить удобную для чтения дату и время, вам необходимо ее преобразовать через localtime()

+0

Я вижу.Раньше я думал, что это означает, что речь идет о добавлении ценности, переданной эпохе. Теперь ясно. Благодарю. – Doherty

+0

Я мог напечатать желаемый формат времени с помощью структуры в localtime(). Не так ли? Если да, то почему strftime можно было использовать? – Doherty

+1

Не сразу в один шаг. Вы получаете структуру, удерживающую значения для дня, месяца, часа, минуты и т. Д. Вы можете использовать их для печати отдельно. Если вы хотите получить полную строку сразу, вам нужно использовать 'asctime()'. Или вы передаете разбитые параметры в strftime. Прочтите справочную страницу, чтобы получить более тонкие детали. – Gerhardh

1

time() - очень старая функция C lib. time_t time(time_t *t); Как вы видите, прототип говорит, что time принимает в качестве аргумента time_t * и возвращает time_t. Это означает, что вы можете получить результат двумя способами. Вы можете сделать, как вы делаете или:

time_t t; 
if ((time_t)-1 == time(&t)) { 
    perror("time()"); 
    return 1; 
} 

Если вы time(NULL), функция не должна запасти результат в указатель time_t * потому, что человек говорит:

Если т не является NULL, то возвращаемое значение также сохраняется в памяти , на которое указывает t.

localtime() преобразовать число вторых, с начала века и разделить его на годы, месяц и т.д .. Вы должны использовать localtime_r(), потому что это поточно.

struct tm result; 
if (localtime_r(&t, &result) == NULL) { 
    return 1; 
} 
Смежные вопросы