Функция difftime
вычисляет разницу между двумя временными значениями и возвращает величину, эквивалентную выражению время1–время2
, как число с плавающей точкой. В ОС Linux значение, возвращаемое функцией time
, — это количество секунд, которое может обрабатываться, но для максимальной переносимости следует применять функцию difftime
.
Для представления времени и даты в более осмысленном (с человеческой точки зрения) виде мы должны преобразовать значение времени в понятные время и дату. Для этого существуют стандартные функции.
Функция gmtime
подразделяет низкоуровневое значение времени на структуру, содержащую более привычные поля:
#include
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
#include
#include
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);
}
Выполнив эту программу, вы получите хорошее соответствие текущим времени и дате:
$ ./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
struct tm *localtime(const time_t *timeval);
Функция localtime
идентична функции gmtime
за исключением того, что она возвращает структуру, содержащую значения с поправками на местный часовой пояс и действующее летнее время. Если вы выполните программу gmtime
, но замените все вызовы функции gmtime
на вызовы localtime
, в отчете программы вы увидите правильные время и дату.
Для преобразования разделенной на элементы структуры tm в общее внутреннее значение времени можно применить функцию mktime
:
#include
time_t mktime(struct tm *timeptr);
Функция mktime
вернет -1, если структура не может быть представлена как значение типа time_t
.
Для вывода программой date
"дружественных" (в противоположность машинному) времени и даты можно воспользоваться функциями asctime
и ctime
:
#include
Читать дальше