Выбрать главу

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.)

struct tm * gmtime(const time_t *t)

Сокращенная форма времени по Гринвичу; функция gmtime() преобразует значение time_t в struct tm, которое выражает данное время в UTC.

struct tm * localtime(const time_t *t)

localtime() ведет себя подобно gmtime() за исключением того, что создается объект struct tm, выраженный в показателях местного времени. Местное время определяется для всей системы путем установки файлов часовых поясов. Его можно переопределить с помощью переменной окружения TZ для пользователей, работающих в часовом поясе, отличном от того, в котором находится компьютер.

time_t mktime(struct tm *tp);

mktime() преобразует struct tm в time_t, предполагая, что struct tm выражается в показателях местного времени.

time_t timegm(struct tm *tp);

timegm() ведет себя подобно mktime() за исключением предположения о том, что struct tm выражается в показателях UTC. Данная функция не является стандартной.

double difftime(time_t time1, time_t time0);

difftime() возвращает число с плавающей запятой, представляющее разность во времени в секундах между двумя значениями time_t. Хотя time_t гарантированно принадлежит к арифметическому типу, единица измерения не определяется в ANSI/ISO С; difftime() возвращает разность в секундах в зависимости от единиц измерения time_t.

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

char *asctime(struct tm *tp);

char *ctime(time_t *t);

asctime() и ctime() служат для преобразования временных значений в стандартную строку даты Unix, которая выглядит примерно так: