Семинар 4. Функции работы со временем
ФУНКЦИИ БИБЛИОТЕКИ TIME.H
Для работы с системной датой и временем в языке Си используется библиотека <time.h>, которая содержит типы и функции для работы с датой и временем.
Библиотека <time.h> определяет два основных типа объектов.
Тип данных time_t – служит для представления времени в удобном для произведения арифметических операций виде, а именно в виде некоторого целого числа, называемого календарным временем. Точность величин типа time_t составляет одну секунду.
Кроме этого в библиотеке содержится структура tm, которая содержит дату и время с разбиением на элементы.
Также в заголовочном файле time.h определен тип данных size_t, который соответствует целому без знаковому типу данных и используется для отображения количества символов строки. Он используется в качестве параметра и значения возврата функцией strftime.
Диапазон представления дат ограничен разрядностью типа данных time_t. Если разрядность time_t эквивалентна типу данных long int, то допустимый диапазон представления дат будет соответствовать
01.01.1970±(232-1) = 12.12.1901 – 19.01.2038
Основные функции работы со временем
Функция time()
Функция измерения текущего календарного времени в секундах. Функция time() возвращает текущее календарное время системы. Если в системе отсчет времени не производится, возвращается значение -1.
time_t time( time_t * t1 );
Функцию time() можно вызывать либо с нулевым указателем, либо с указателем на переменную типа time_t. В последнем случае этой переменной будет присвоено календарное время. Будучи вызванной с параметром NULL, она возвращает число секунд, прошедших с 01.01.1970 по Гринвичу. Это – дата основания операционной системы UNIX (по крайней мере, так принято считать).
#include <stdio.h>
#include <time.h>
int main()
{
time_t t1;
time(&t1);
time_t t2=time(NULL);
time_t t3;
t3=time(NULL);
return 0;
}
В результате работы этой программы в переменные t1, t2 и t3 будут занесено целое число, значение которого определяет число секунд от 01.01.1970 до текущего времени.
Функция ctime / ctime_r
Функция записи времени и даты стандартной строкой.
В качестве аргумента функции передается указатель на переменную типа time_t. Возвращает функция указатель на строку, содержащую информацию о дате и времени.
char * ctime( const time_t * t1);
Функция преобразует значение типа time_t в строку, которая содержит дату и время в человеко-понятном формате:
Ннн Ммм дд чч: мм: сс гггг
где: Ннн — это день недели; Ммм — месяц; дд — день; чч: мм: сс – время (часы, минуты, секунды); гггг – год. В конце строки стоит завершающий нулевой символ ‘\0’ и символ новой строки ‘\n’.
Например: Thu Oct 22 20:55:11 2015
Пример использования функции:
printf("%s", ctime(&t1));
Функция возвращает указатель на строку, таким образом, можно присвоить результат ее работы строке:
char *pr;
pr=ctime(&t1);
printf("pr=%s", pr);
Полученная в результате работы команды строка может быть сразу занесена в предварительно созданную строку при помощи команды ctime_r.
char * ctime_r( const time_t * t1, char * pr1);
Здесь первый аргумент t1 является переменной типа time_t, значение которого преобразуется в строку и заносится в переменную pr1). Пример:
char pr1[26];
ctime_r(&t1,pr1);
printf("pr1=%s", pr1);
Следует отметить, что представление даты и времени в стандарте ISO 8601 имеет формат, отличный от формата строки, возвращаемой функцией ctime:
Ввгг-мм-ддTчч:мм:сс
Здесь поля ВВГГ соответствуют векам и годам даты соответственно; ММ – месяц года в числовом эквиваленте (1-12), ДД – дата; чч – часы; мм – минуты; сс – секунды; Т – указатель времени.
Функция difftime
Функция измерения промежутка календарного времени.
Возвращает в формате double разность в секундах между временем t1 и временем t2. Формат команды:
double difftime(time_t end, time_t start);
Пример работы
#include <stdio.h>
#include <time.h>
int main()
{
int i, n;
double dif;
time_t t1=time(NULL);
time_t t2;
for (i=0; i<30000; i++)
printf ("Wait…\n");
time(&t2);
dif=difftime(t2, t1);
printf("dif=%f\n", dif);
return 0;
}
В результате работы программы будет выведено число, соответствующее времени выполнения цикла.
Указанные выше функции позволяют определять число секунд и выводить результат в удобной для пользователя форме, однако не позволяют работать с данными о дате и времени. Для возможности не только вывода на экран данных о времени, но и обработки соответствующих полей, библиотека time.h содержит специальную структуру tm, содержащую все поля времени и даты в виде целочисленных значений.
Структура tm имеет вид:
struct tm
{
int tm_sec; // секунды после минут [0,59]
int tm_min; // минуты после часов [0,59]
int tm_hour; // часы после полуночи [0,23]
int tm_mday; // день месяца [1,31]
int tm_mon; // месяц года (январь = 0) [0,11]
int tm_year; // год (1900 год = 0)
int tm_wday; // день недели (вс = 0) [0,6]
int tm_yday; // день года (1 января = 0) [0,365]
int tm_isdst; // флаг перехода на летнее время (Daylight Saving Time) = 0
// >0 – зимнее время; <0 – не действует.
};
Первые три поля и поле tm_isdst относятся ко времени. Поля tm_mday, tm_mon, tm_year задают дату. Поля tm_wday и tm_yday имеют особенность – они вычисляются в структуре tm автоматически.
Структура – это сложный тип данных представляющий собой упорядоченное в памяти множество элементов различного типа. Каждый элемент в структуре имеет свое имя и называется полем. В Си элементы структуре располагаются последовательно, а размер структуры определяется суммой размеров всех элементов.
Объявление в Си структуры имеет вид:
struct [имя типа]
{
поле_1;
поле_2;
...
поле_N;
} [список переменных];
Объявление полей структуры возможно только без инициализации. Если несколько полей следующих друг за другом в описании структуры имеют один и тот же тип, то для их описания можно использовать синтаксис объявления нескольких переменных одного и того же типа. Типом поля может быть любой тип (как системный, так и пользовательский), описанный ранее.
Пример структуры в Си, содержащей информацию о точке в двумерном пространстве (координаты):
struct Point
{
double x, y;
};
Допускается создание объектов типа структура после описания или одновременно. В первом случае необходимо создать экземпляр
struct Point A;
во втором случае имя экземпляра указывается в момент описания структуры
struct Point
{
double x, y;
}A;
Имена объектов могут быть указаны через запятую:
struct Point
{
double x, y;
}A, B, C;
Если объект типа структуры создавался в момент инициализации, то позже также можно задавать другие экземпляры то й же структуры.
Обращение к полям структуры осуществляется в следующем виде:
<имя_переменной>.<имя_поля>
Например,
A.x=10;
Для работы со структурой tm в библиотеке time.h содержаться следующие функции.
