Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семинар 4.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
103.94 Кб
Скачать

Семинар 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 содержаться следующие функции.