Основы программирования в Linux
$ <b>./anytime</b>The time is 1179643852The time is 1179643854The time is 1179643856The time is 1179643858The time is 1179643860The time is 1179643862The time is 1179643864The time is 1179643866The time is 1179643868The time is 1179643870Как это работает
Программа вызывает функцию
с пустым указателем в качестве аргумента, которая возвращает время и дату как количество секунд. Программа засыпает на две секунды и повторяет вызов time в целом 10 раз.timeИспользование времени и даты в виде количества секунд, прошедших с начала 1970 г., может быть полезно для измерения длительности чего-либо. Вы сможете сосчитать простую разность значений, полученных из двух вызовов функции
. Однако комитет, разрабатывавший стандарт языка ISO/ANSI С, в своих решениях не указал, что типtimeбудет применяться для определения произвольных интервалов времени в секундах, поэтому была придумана функцияtime_t, которая вычисляет разность в секундах между двумя значениями типаdifftimeи возвращает ее как величину типаtime_t:double<b>#include <time.h></b><b>double difftime(time_t time1, time_t time2);</b>Функция
вычисляет разницу между двумя временными значениями и возвращает величину, эквивалентную выражениюdifftime, как число с плавающей точкой. В ОС Linux значение, возвращаемое функциейвремя1–время2, — это количество секунд, которое может обрабатываться, но для максимальной переносимости следует применять функциюtime.difftimeДля представления времени и даты в более осмысленном (с человеческой точки зрения) виде мы должны преобразовать значение времени в понятные время и дату. Для этого существуют стандартные функции.
Функция
подразделяет низкоуровневое значение времени на структуру, содержащую более привычные поля:gmtime<b>#include <time.h></b><b>struct tm *gmtime(const time_t timeval)</b>В структуре
, как минимум, определены элементы, перечисленные в табл. 4.2.tmТаблица 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",tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec);exit(0);}Выполнив эту программу, вы получите хорошее соответствие текущим времени и дате:
$ <b>./gmtime; date</b>Raw time is 1179644196gmtime gives:date: 107/05/20time: 06:56:36Sun May 20 07:56:37 BST 2007Как это работает
Программа вызывает функцию
для получения машинного представления значения времени и затем вызывает функцию gmtime для преобразования его в структуру с удобными для восприятия значениями времени и даты. Она выводит на экран полученные значения с помощью функцииtime. Строго говоря, выводить необработанное значение времени таким способом не следует, потому что наличие типа длинного целого не гарантировано во всех системах. Если сразу же после вызова функции gmtime выполнить команду date, можно сравнить оба вывода.printfНо здесь у вас возникнет небольшая проблема. Если вы запустите эту программу в часовом поясе, отличном от Greenwich Mean Time (время по Гринвичу) или у вас действует летнее время, как у нас, вы заметите, что время (и, возможно, дата) неправильное. Все дело в том, что функция
возвращает время по Гринвичу (теперь называемое Universal Coordinated Time (всеобщее скоординированное время) или UTC). Системы Linux и UNIX поступают так для синхронизации всех программ и систем в мире. Файлы, созданные в один и тот же момент в разных часовых поясах, будут отображаться с одинаковым временем создания. Для того чтобы посмотреть местное время, следует применять функциюgmtime.localtime