<b>#include <time.h></b>
<b>struct tm *localtime(const time_t *timeval);</b>
Функция localtime идентична функции gmtime за исключением того, что она возвращает структуру, содержащую значения с поправками на местный часовой пояс и действующее летнее время. Если вы выполните программу gmtime, но замените все вызовы функции gmtime на вызовы localtime, в отчете программы вы увидите правильные время и дату.
Для преобразования разделенной на элементы структуры tm в общее внутреннее значение времени можно применить функцию mktime:
<b>#include <time.h></b>
<b>time_t mktime(struct tm *timeptr);</b>
Функция mktime вернет -1, если структура не может быть представлена как значение типа time_t.
Для вывода программой date "дружественных" (в противоположность машинному) времени и даты можно воспользоваться функциями asctime и ctime:
<b>#include <time.h></b>
<b>char *asctime(const struct tm *timeptr);</b>
<b>char *ctime(const time_t *timeval);</b>
Функция asctime возвращает строку, представляющую время и дату, заданные tm-структурой timeptr. У возвращаемой строки формат, подобный приведенному далее:
Sun Jun 9 12:34:56 2007n
У нее всегда фиксированный формат длиной 26 символов. Функция ctime эквивалентна следующему вызову:
asctime(localtime(timeval))
Она принимает необработанное машинное значение времени и преобразует его в местное время.
А теперь выполните упражнение 4.8.
Упражнение 4.8. Функция ctime
В этом примере благодаря приведенному далее программному коду вы увидите функцию ctime в действии.
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
time_t timeval;
(void)time(&timeval);
printf ("The date is: %s", ctime(&timeval));
exit(0);
}
Откомпилируйте и затем запустите на выполнение ctime.c, и вы увидите нечто похожее на приведенные далее строки:
$ <b>./ctime</b>
The date is: Sat Jun 9 08:02:08 2007.
Как это работает
Программа ctime.c вызывает функцию time для получения машинного значения времени и дает возможность функции ctime выполнить всю тяжелую работу по преобразованию этого значения в удобочитаемую строку, которую потом и выводит на экран.
Для лучшего управления точным форматированием времени и даты ОС Linux и современные UNIX-подобные системы предоставляют функцию strftime. Она довольно похожа на функцию sprintf для дат и времени и действует аналогичным образом:
<b>#include <time.h></b>
<b>size_t strftime(char *s, size_t maxsize, const char *format, struct tm *timeptr);</b>
Функция strftime форматирует время и дату, представленные в структуре tm, на которую указывает параметр, timeptr, и помещает результат в строку s. Эта строка задается длиной maxsize (как минимум) символов. Строка format применяется для управления символами, записываемыми в строку. Как и в функции printf, она содержит обычные символы, которые будут переданы в строку, и спецификаторы преобразований для форматирования элементов времени и даты. В табл. 4.3 перечислены используемые спецификаторы преобразований.
Таблица 4.3
Спецификатор преобразования Описание %a Сокращенное название дня недели %А Полное название дня недели %b Сокращенное название месяца %B Полное название месяца %c Дата и время %d День месяца, 01–31 %H Час, 00–23 %I Час по 12-часовой шкале, 01–12 %j День в году, 001–366 %m Номер месяца в году, 01–12 %M Минуты, 00–59 %p a.m. (до полудня) или p.m. (после полудня) %S Секунды, 00–59 %u Номер дня недели, 1–7 (1 соответствует понедельнику) %U Номер недели в году, 01–53 (воскресенье — первый день недели) %V Номер недели в году, 01–53 (понедельник — первый день недели) %w Номер дня недели, 0–6 (0 соответствует воскресенью) %x Дата в региональном формате %X Время в региональном формате %y Номер года, меньший 1900 %Y Год %Z Название часового пояса %% Символ %