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

на главную - закладки

Жанры

Основы программирования в 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 перечислены используемые спецификаторы преобразований.

Поделиться:
Популярные книги

Антон Чехов

Труайя Анри
Проза:
историческая проза
5.00
рейтинг книги
Антон Чехов

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

Директива Джэнсона

Ладлэм Роберт
Детективы:
шпионские детективы
7.00
рейтинг книги
Директива Джэнсона

Я – Легенда

Гарцевич Евгений Александрович
1. Я - Легенда!
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
5.00
рейтинг книги
Я – Легенда

Учитель из прошлого тысячелетия

Еслер Андрей
6. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Учитель из прошлого тысячелетия

Наномашины, ученик! Том 6

Новиков Николай Васильевич
6. Первый среди карапузов
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наномашины, ученик! Том 6

Кодекс Крови. Книга VII

Борзых М.
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.25
рейтинг книги
Кодекс Крови. Книга VII

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога

Вторжение

Гагарин Станислав Семенович
Фантастика:
детективная фантастика
4.50
рейтинг книги
Вторжение

АПРК «Курск». Послесловие к трагедии

Шигин Владимир Виленович
Досье
Документальная литература:
прочая документальная литература
5.00
рейтинг книги
АПРК «Курск». Послесловие к трагедии

Бездна

Роллинс Джеймс
102. Книга-загадка, книга-бестселлер
Детективы:
триллеры
9.19
рейтинг книги
Бездна

Наследие Маозари 8

Панежин Евгений
8. Наследие Маозари
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 8

Дневник (1887-1910)

Ренар Жюль
Проза:
проза прочее
4.00
рейтинг книги
Дневник (1887-1910)

Осень 1943 года

Антонова Людмила Викторовна
15. Летопись Победы. 1443 дня и ночи до нашей Великой Победы во Второй мировой войне
Научно-образовательная:
история
cпецслужбы
военная история
5.00
рейтинг книги
Осень 1943 года