Скачиваний:
65
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

12.4. Время

В ОС UNIX существует группа процедур для установки и получения системного времени. Время в системе измеряется как число секунд, прошедших с 00:00:00 по Гринвичу с 1 января 1970 г., и размер переменной для хранения этого числа должен быть не меньше формата longint.

Основным вызовом этой группы является системный вызов GetTimeOfDay, который возвращает текущее время в стандартном формате времени системы UNIX.

Описание

uses linux;

Function GetTimeOfDay:longint;

Человеку сложно представлять время в виде большого числа секунд, поэтому в ОС UNIX существует набор библиотечных процедур для перевода системного времени в более понятную форму. Наиболее общей является процедура сtime, которая преобразует вывод вызова GetTimeOfDay в строку из 26 символов, например, выполнение следующей программы

uses linux,stdio;

var

tt:longint;

begin

tt:=gettimeofday;

write('Текущее время ', ctime (tt));

halt(0);

end.

дает примерно такой вывод:

Текущее время Tue Mar 18 00:17:06 1998

С функцией ctime связан набор процедур, использующих структуры типа tm. Тип структуры tm определен в файле stdio и содержит следующие элементы:

tm=record

tm_sec:longint; (* Секунды *)

tm_min:longint; (* Минуты *)

tm_hour:longint; (* Часы от 0 до 24 *)

tm_mday:longint; (* Дни месяца от 1 до 31 *)

tm_mon:longint; (* Месяц от 0 до 11 *)

tm_year:longint; (* Год минус 1900 *)

tm_wday:longint; (* День недели Воскресенье = 0 *)

tm_yday:longint; (* День года 0-365 *)

tm_isdst:longint; (* Флаг летнего времени только для США *)

end;

ptm=^tm;

Назначение всех элементов очевидно. Некоторые из процедур, использующих эту структуру, описаны ниже.

Описание

uses stdio;

function localtime(var _timeval:longint):ptm;

function gmtime(var _timeval:longint):ptm;

function asctime(const tptr:ptm):pchar;

function mktime(tptr:ptm):longint;

function difftime(time1, time2:longint):double;cdecl;external 'c';

Процедуры localtime и gmtime конвертируют значение, полученное в результате вызова GetTimeOfDay, в структуру tm и возвращают локальное время и стандартное гринвичское время соответственно. Например, программа

(* Программа tm - демонстрация структуры tm *)

uses linux,stdio;

var

t:longint;

tp:ptm;

begin

(* Получить системное время *)

t:=gettimeofday;

(* Получить структуру tm *)

tp := localtime (t);

printf ('Время %02d:%02d:%02d'#$a, [tp^.tm_hour, tp^.tm_min,

tp^.tm_sec]);

halt (0);

end.

выводит сообщение

Время 1:13:23

Процедура asctime преобразует структуру tm в строку в формате вывода процедуры ctime, а процедура mktime преобразует структуру tm в соответствующее ей системное время (число секунд). Процедура difftime возвращает разность между двумя значениями времени в секундах.

Другие функции для работы со временем:

EpochToLocal

Преобразует время от начала эпохи в локальные дату и время

GetDate

Возвращает системную дату

GetDateTime

Возвращает системные дату и время

GetEpochTime

То же, что и GetTimeOfDay, но с учетом временной зоны

GetLocalTimezone

Возвращает системную временную зону

GetTime

Возвращает системное время

GetTimezoneFile

Возвращает имя файла временной зоны

ReadTimezoneFile

Возвращает содержимое файла временной зоны

Пример использования GetEpochTime:

Uses linux;

begin

Write ('Secs past the start of the Epoch (00:00 1/1/1970) : ');

Writeln (GetEpochTime);

end.

Пример использования EpochToLocal:

Uses linux;

Var Year,month,day,hour,minute,seconds : Word;

begin

EpochToLocal (GetEpochTime,Year,month,day,hour,minute,seconds);

Writeln ('Current date : ',Day:2,'/',Month:2,'/',Year:4);

Writeln ('Current time : ',Hour:2,':',minute:2,':',seconds:2);

end.

Упражнение 12.3. Напишите свою версию процедуры asctime.

Упражнение 12.4. Напишите функцию weekday, возвращающую 1 для рабочих дней и 0 для выходных. Напишите обратную функцию weekend. Эти функции также должны предоставлять возможность задания выходных дней.

Упражнение 12.5. Напишите процедуры, возвращающие разность между двумя значениями, полученными при вызове gettimeofday в днях, месяцах, годах и секундах. Не забывайте про високосные годы!

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal