Чтение онлайн

ЖАНРЫ

Основы программирования в Linux
Шрифт:

tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec);

 exit(0);

}

Выполнив эту программу, вы получите хорошее соответствие текущим времени и дате:

$ ./gmtime; date

Raw time is 1179644196

gmtime gives:

date: 107/05/20

time: 06:56:36

Sun May 20 07:56:37 BST 2007

Как это работает

Программа вызывает функцию

time
для получения машинного представления значения времени и затем вызывает функцию gmtime для преобразования его в структуру с удобными для восприятия значениями времени и даты. Она выводит на экран полученные значения
с помощью функции
printf
. Строго говоря, выводить необработанное значение времени таким способом не следует, потому что наличие типа длинного целого не гарантировано во всех системах. Если сразу же после вызова функции gmtime выполнить команду date, можно сравнить оба вывода.

Но здесь у вас возникнет небольшая проблема. Если вы запустите эту программу в часовом поясе, отличном от Greenwich Mean Time (время по Гринвичу) или у вас действует летнее время, как у нас, вы заметите, что время (и, возможно, дата) неправильное. Все дело в том, что функция

gmtime
возвращает время по Гринвичу (теперь называемое Universal Coordinated Time (всеобщее скоординированное время) или UTC). Системы Linux и UNIX поступают так для синхронизации всех программ и систем в мире. Файлы, созданные в один и тот же момент в разных часовых поясах, будут отображаться с одинаковым временем создания. Для того чтобы посмотреть местное время, следует применять функцию
localtime
.

#include <time.h>

struct tm *localtime(const time_t *timeval);

Функция

localtime
идентична функции
gmtime
за исключением того, что она возвращает структуру, содержащую значения с поправками на местный часовой пояс и действующее летнее время. Если вы выполните программу
gmtime
, но замените все вызовы функции
gmtime
на вызовы
localtime
, в отчете программы вы увидите правильные время и дату.

Для преобразования разделенной на элементы структуры tm в общее внутреннее значение времени можно применить функцию

mktime
:

#include <time.h>

time_t mktime(struct tm *timeptr);

Функция

mktime
вернет -1, если структура не может быть представлена как значение типа
time_t
.

Для вывода программой

date
"дружественных" (в противоположность машинному) времени и даты можно воспользоваться функциями
asctime
и
ctime
:

#include <time.h>

char *asctime(const struct tm *timeptr);

char *ctime(const time_t *timeval);

Функция

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, и вы увидите нечто похожее на приведенные далее строки:

$ ./ctime

The date is: Sat Jun 9 08:02:08 2007.

Как это работает

Программа ctime.c вызывает

функцию
time
для получения машинного значения времени и дает возможность функции
ctime
выполнить всю тяжелую работу по преобразованию этого значения в удобочитаемую строку, которую потом и выводит на экран.

Для лучшего управления точным форматированием времени и даты ОС Linux и современные UNIX-подобные системы предоставляют функцию

strftime
. Она довольно похожа на функцию
sprintf
для дат и времени и действует аналогичным образом:

#include <time.h>

size_t strftime(char *s, size_t maxsize, const char *format, struct tm *timeptr);

Функция

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
Название часового пояса
%%
Символ
%
Поделиться с друзьями: