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

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

Жанры

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

Время задается с помощью типа

time_t
. Это целочисленный тип, достаточный для хранения дат и времени в секундах. В Linux-подобных системах это тип
long integer
(длинное целое), определенный вместе с функциями, предназначенными для обработки значений времени, в заголовочном файле time.h.

Примечание

Не думайте, что для хранения времени достаточно 32 битов. В системах UNIX и Linux, использующих 32-разрядный тип

time_t
, временное значение "будет превышено" в 2038 г. Мы надеемся, что к тому времени системы перейдут на тип
time_t
, содержащий более 32 битов. Недавнее широкое внедрение 64-разрядных процессоров превращает это практически в неизбежность.

#include <time.h>

time_t time(time_t *tloc);

Вы можете найти низкоуровневое значение времени, вызвав функцию

time
, которая вернет количество секунд с начала эпохи (упражнение 4.6). Она также запишет возвращаемое значение по адресу памяти, на который указывает параметр
tloc
, если он — непустой указатель.

Упражнение 4. Функция
time

Далее для демонстрации функции time приведена простая программа envtime.c.

#include <time.h>

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

int main {

 int i;

 time_t the_time;

 for (i = 1; i <= 10; i++) {

the_time = time((time_t *)0);

printf("The time is %ld\n", the_time);

sleep(2);

 }

 exit(0);

}

Когда вы запустите программу, она будет выводить низкоуровневое значение времени каждые 2 секунды в течение 20 секунд.

$ ./anytime

The time is 1179643852

The time is 1179643854

The time is 1179643856

The time is 1179643858

The time is 1179643860

The time is 1179643862

The time is 1179643864

The time is 1179643866

The time is 1179643868

The time is 1179643870

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

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

time
с пустым указателем в качестве аргумента, которая возвращает время и дату как количество секунд. Программа засыпает на две секунды и повторяет вызов time в целом 10 раз.

Использование времени и даты в виде количества секунд, прошедших с начала 1970 г., может быть полезно для измерения длительности чего-либо. Вы сможете сосчитать простую разность значений, полученных из двух вызовов функции

time
. Однако комитет, разрабатывавший стандарт языка ISO/ANSI С, в своих решениях не указал, что тип
time_t
будет применяться для определения произвольных интервалов времени в секундах, поэтому была придумана функция
difftime
, которая вычисляет разность в секундах между двумя значениями типа
time_t
и возвращает ее как величину типа
double
:

#include <time.h>

double difftime(time_t time1, time_t time2);

Функция

difftime
вычисляет разницу между двумя временными значениями и возвращает величину, эквивалентную выражению
время1–время2
,
как число с плавающей точкой. В ОС Linux значение, возвращаемое функцией
time
, — это количество секунд, которое может обрабатываться, но для максимальной переносимости следует применять функцию
difftime
.

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

Функция

gmtime
подразделяет низкоуровневое значение времени на структуру, содержащую более привычные поля:

#include <time.h>

struct tm *gmtime(const time_t timeval)

В структуре

tm
, как минимум, определены элементы, перечисленные в табл. 4.2.

Таблица 4.2

Элемент
tm
Описание
int tm_sec
Секунды, 0–61
int tm_min
Минуты, 0–59
int tm_hour
Часы, 0–23
int tm_mday
День в месяце, 1–31
int tm_mon
Месяц в году, 0–11 (January (январь) соответствует 0)
int tm_year
Годы, начиная с 1900 г.
int tm_wday
День недели, 0–6 (Sunday (воскресенье) соответствует 0)
int tm_yday
День в году, 0–365
int tm_isdst
Действующее летнее время

Диапазон элемента

tm_sec
допускает появление время от времени корректировочной секунды или удвоенной корректировочной секунды.

Выполните упражнение 4.7.

Упражнение 4.7. Функция
gmtime

Далее приведена программа gmtime.с, выводящая текущие время и дату с помощью структуры

tm
и функции
gmtime
.

#include <time.h>

#include <stdio.h>

#include <stdlib.h>

int main {

 struct tm *tm_ptr;

 time_t the_time;

 (void)time(&the_time);

 tm_ptr = gmtime(&the_time);

 printf("Raw time is %ld\n", the_time);

 printf("gmtime gives:\n");

 printf("date: %02d/%02d/%02d\n",

tm_ptr->tm_year, tm_ptr->tm_mon+1, tm_ptr->tm_mday);

 printf("time: %02d:%02d:%02d\n",

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

Сталин

Радзинский Эдвард Станиславович
3. Загадки жизни и смерти
Проза:
историческая проза
7.36
рейтинг книги
Сталин

Первый среди равных. Книга III

Бор Жорж
3. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
6.00
рейтинг книги
Первый среди равных. Книга III

Дракон

Бубела Олег Николаевич
5. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.31
рейтинг книги
Дракон

Студент из прошлого тысячелетия

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

Воронцов. Перезагрузка

Тарасов Ник
1. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.00
рейтинг книги
Воронцов. Перезагрузка

Кодекс Охотника. Книга ХХХ

Винокуров Юрий
30. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга ХХХ

Дважды одаренный. Том III

Тарс Элиан
3. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
юмористическое фэнтези
5.00
рейтинг книги
Дважды одаренный. Том III

Черный Маг Императора 17

Герда Александр
17. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 17

Эволюционер из трущоб. Том 7

Панарин Антон
7. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 7

Князь Медведев. Дилогия

Вяч Павел
Медведев
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Князь Медведев. Дилогия

Отход

Видум Инди
4. Петя и Валерон
Фантастика:
рпг
аниме
попаданцы
5.00
рейтинг книги
Отход

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Адепт

Неправильный лекарь. Том 1

Измайлов Сергей
1. Неправильный лекарь
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неправильный лекарь. Том 1

Я все еще князь. Книга XXI

Дрейк Сириус
21. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще князь. Книга XXI