<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 2007\n\0
У нее всегда фиксированный формат длиной 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
| Название часового пояса |
%%
| Символ %
|