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

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

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

18.1. Вывод времени и даты

18.1.1. Представление времени

В системах Unix и Linux время отслеживается в секундах до или после начала эпохи, которое определяется как полночь 1 января 1970 года по UTC [148] . Положительные значения времени относятся к периоду после начала эпохи; отрицательные — до начала эпохи. Для того чтобы обеспечить работу процессов в режиме текущего времени, в Linux, как и во всех остальных версиях Unix, предусмотрен системный вызов

time
.

148

UTC — Universal Coordinated Time (универсальное синхронизированное время), на которое иногда ошибочно ссылаются

как на UCT, приблизительно эквивалентное среднему времени по Гринвичу (GMT) и зулу. Описание всех часовых поясов выходит за рамки материала, рассматриваемого в настоящей книге.

#include <time.h>

time_t time (time_t *t);

Функция

time
возвращает количество секунд, прошедших с момента начала эпохи. Если значение
t
не является нулевым, то данная функция передает в эту переменную количество секунд, прошедших с начала эпохи.

Для решения некоторых проблем требуется более высокая разрешающая способность. В Linux предусмотрен еще один системный вызов —

gettimeofday
, который предоставляет более подробную информацию.

#include <sys/time.h>

#include <unistd.h>

int gettimeofday(struct timeval *tv, struct timezone *tz);

struct timeval {

 int tv_sec; /* секунды */

 int tv_usec; /* микросекунды */

};

struct timezone {

 int tz_minuteswest; /* минуты на запад от Гринвича */

 int tz_dsttime; /* тип корректировки dst */

};

На большинстве платформ, включая i386, система Linux поддерживает возможность очень точного измерения времени. Стандартные персональные компьютеры содержат встроенные часы, которые обеспечивают информацию о текущем времени с точностью до микросекунд. Оборудование Alpha и SPARC также предлагает высокоточный таймер. На некоторых других платформах система Linux может отслеживать время только в пределах разрешающей способности системного таймера, который в общем случае устанавливается на значение 100 Гц. В связи с этим член

tv_usec
структуры
timeval
в подобных системах может иметь меньшую точность.

В

sys/time.h
определены пять макросов для обработки структур
timeval
.

timerclear(struct timeval *)

Данный макрос очищает структуру

timeval
.

timerisset(struct timeval *)

Данный макрос проверяет структуру

timeval
на заполнение (другими словами, отличен ли хотя бы один элемент от нуля).

timercmp(struct timeval *t0, struct timeval *t1, operator)

Данный макрос позволяет сравнивать две структуры

timeval
в одном временном интервале. Он вычисляется в логический эквивалент
t0 операция t1
, если
t0
и
t1
относятся к арифметическим типам. Обратите внимание на то, что макрос
timercmp
не работает для операций
<=
и
>=
. Вместо этого нужно применять формы
!timercmp(t1, t2, >)
и
!timercmp(t1, t2, <)
.

timeradd(struct timeval *t0, struct timeval *t1, struct timeval *result)

Добавляет

t0
к
t1
и размещает сумму в переменной
result
.

timersub(struct timeval *t0, struct timeval *t1, struct timeval *result)

Вычитает

t1
из
t0
и передает разность в переменную
result
.

Третье представление времени

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

struct tm {

 int tm_sec;

 int tm_min;

 int tm_hour;

 int tm_mday;

 int tm_mon;

 int tm_year;

 int tm_wday;

 int tm_yday;

 int tm_isdst;

 long int tm_gmtoff;

 const char *tm_zone;

};

Первые

девять элементов являются стандартными, последние два — нестандартные, однако очень полезные (они существуют в системах Linux).

tm_sec
Количество прошедших секунд в минуте. Принимает значения от 0 до 61 (две дополнительные секунды выделяются для учета лишних секунд, относящихся к високосному году).
tm_min
Количество прошедших минут в часе. Принимает значения от 0 до 59.
tm_hour
Количество прошедших часов в сутках. Принимает значения от 0 до 23.
tm_mday
Номер дня месяца. Принимает значения от 1 до 31. Это единственный элемент, который не может равняться нулю.
tm_mon
Количество прошедших месяцев в году. Принимает значения от 0 до 11.
tm_year
Количество прошедших лет (считая с 1900 года).
tm_wday
Количество прошедших дней в неделе (считая от воскресенья). Принимает значения от 0 до 6.
tm_yday
Количество прошедших дней в году. Принимает значения от 0 до 365.
tm_isdst
Определяет, поддерживается ли летнее время в текущем часовом поясе,
tm_isdst
принимает положительное значение, если время переведено на летнее, 0 — если не переведено, 1 — если система не может это определить.
tm_gmtoff
Параметр не является переносимым, поскольку он используется не во всех системах. Если он существует, то он может также называться
__tm_gmtoff
. Данная переменная указывает число секунд к востоку от UTC или отрицательное число секунд к западу от UTC для часовых поясов к востоку от линии перемены дат.
tm_zone
Параметр не является переносимым, поскольку он используется не во всех системах. Если он существует, то он может также называться
__tm_zone
. Он содержит название текущего часового пояса (некоторые часовые пояса могут иметь несколько имен).

В завершение, стандарт POSIX.1b обработки данных в режиме реального времени поддерживает даже большую разрешающую способность, чем доступные в стандарте

struct timeval
микросекунды. В структуре
struct timespec
используются наносекунды, а также выделено больше пространства для размещения чисел.

struct timespec {

 long int tv_sec; /* секунды */

 long int tv_nsec; /* наносекунды */

};

18.1.2. Преобразование, форматирование и разбор значений времени

Для взаимно-обратных преобразований времени, выраженного в показателях

time_t
, и времени, выраженного в показателях
struct tm
, используются четыре функции. Три из них являются стандартными и доступны во всех системах Linux и Unix. Четвертая, не менее полезная, может применяться не всегда, поскольку она работает только в современных системах Linux. Пятая функция (стандартная) вычисляет разность в секундах между значениями времени
time_t
. (Обратите внимание на то, что даже аргументы
time_t
передаются как указатели, а не как только аргументы
struct tm
.)

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

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

Неудержимый. Книга XVIII

Боярский Андрей
18. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVIII

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Шаман. Похищенные

Калбазов Константин Георгиевич
1. Шаман
Фантастика:
боевая фантастика
попаданцы
6.44
рейтинг книги
Шаман. Похищенные

Совок

Агарев Вадим
1. Совок
Фантастика:
фэнтези
детективная фантастика
попаданцы
8.13
рейтинг книги
Совок

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Ведьма Вильхельма

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
8.67
рейтинг книги
Ведьма Вильхельма

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

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

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

Плохая невеста

Шторм Елена
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Плохая невеста