Основы программирования в Linux
<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>Функция
вернет -1, если структура не может быть представлена как значение типаmktime.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. У возвращаемой строки формат, подобный приведенному далее:timeptrSun Jun 9 12:34:56 2007\n\0У нее всегда фиксированный формат длиной 26 символов. Функция
эквивалентна следующему вызову:ctimeasctime(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, она содержит обычные символы, которые будут переданы в строку, и спецификаторы преобразований для форматирования элементов времени и даты. В табл. 4.3 перечислены используемые спецификаторы преобразований.printfТаблица 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 %pa.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Название часового пояса %%Символ %