Главная » Free Pascal » Альтернативные средства работы с датами и временем Free Pascal

0

Одна из дополнительных возможностей определения компонентов текущей ка- лендарной даты и показаний системных часов заключается в прямом обращении к соответствующей функции операционной системы (листинг 14.7).

   Листинг 1 4 .7 .  Программа  Win_Date                                            

program Win_Date;

uses Windows,DateUtils,SysUtils; var

st: SystemTime;

dt: TDateTime;

Fmt: string=’ddddd hh:nn:ss.zzz'; begin

dt:=Now;

GetSystemTime(st);

writeln(FormatDateTime(Fmt,dt));

writeln(‘Day Of The Week = ‘,DayOfTheWeek(dt)); writeln;

writeln(‘Year = ‘,st.wYear); writeln(‘Month = ‘,st.wMonth); writeln(‘Day Of Week = ‘,st.wDayOfWeek); writeln(‘Day Of Month = ‘,st.Day); writeln(‘Hour = ‘,st.wHour); writeln(‘Minute = ‘,st.Minute); writeln(‘Second = ‘,st.wSecond);

writeln(‘Milliseconds = ‘,st.wMilliseconds); readln;

end.

В этом примере системная функция GetSystemTime возвращает отдельные ком- поненты системной даты в целочисленных полях структуры типа SystemTime. Running "e:\fpc\myprog\win_date.exe "

22.11.2009 12:54:50.281

Day Of The Week = 7

Year = 2009

Month = 11

Day Of Week = 0 Day Of Month = 22 Hour = 9

Minute = 54

Second = 50

Milliseconds = 281

Несовпадение отдельных компонентов с форматом TDateTime вызвано двумя обстоятельствами. Во-первых, часовой пояс Москвы отличается на три часа от ну- левого меридиана, проходящего через обсерваторию Гринвича. Во-вторых, сис- темная нумерация дней недели ведется по модулю 7, поэтому воскресенье имеет нулевой числовой код. Эти детали несложно учесть в программе.

Вторая возможность заключается в использовании устаревших процедур, дос- тавшихся нам как наследие MS-DOS.

Эти процедуры и используемая ими структура данных входят в состав модуля

Dos: type

DateTime = packed record  // упакованная запись

Year : word;            // год из диапазона [1980..2099]

Month: word;            // месяц из диапазона [1..12]

Day : word;            // день месяца из диапазона [1..31]

Hour : word;            // часы из диапазона [0..23]

Min : word;            // минуты из диапазона [0..59]

Sec : word;            // секунды из диапазона [0..59] end;

var

dt : DateTime;            // запись для хранения даты и времени pack_dt : longint;        // для упакованных полей даты и времени S100 : word;             // для хранения сотых долей секунды WeekDay : word;           // для хранения номера дня недели

GetTime(Hour, Min, Sec, S100);      // опрос системного времени GetDate(Year, Month, Day, WeekDay); // опрос системной даты PackTime(dt,pack_dt);       // упаковка даты и времени UnpackTime(pack_dt,dt);     // распаковка даты и времени

Номер дня недели (WeekDay) отсчитывался от нуля, соответствовавшего воскре- сенью.

Четыре байта, отведенных для хранения упакованных значений компонентов календарной даты и времени, использовались следующим образом:

Year

Month

Day

Hour

Min

Sec/2

7 бит

4 бита

5 бит

5 бит

6 бит

5 бит

При этом в поле Year записывалась разность между текущим годом и началом допустимого интервала (1980), а в поле Sec/2 — число секунд, деленное пополам (у нечетных значений младшая единица отбрасывалась). Естественно, что распа- ковка упакованной величины не могла правильно восстановить исходное значение нечетных секунд.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии