Системное программирование в UNIX средствами Free Pascal

в виде большого числа секунд,


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 в днях, месяцах, годах и секундах. Не забывайте про високосные годы!

Содержание раздела