Главная » Free Pascal » Сравнение календарных дат и показаний часов Free Pascal

0

Сравнение календарных и/или временных компонентов может быть выполнено двумя способами. Функции, чьи имена начинаются со слова Compare (сравнить), возвращают целочисленный результат. Он может быть положительным, если пер- вый аргумент (или его часть) больше второго аргумента (или соответствующей его части), равен нулю в случае равенства сравниваемых значений, и отрицательным, если первое значение меньше второго. Функции, имена которых начинаются со слова Same (такой же), возвращают логическое значение, равное True в случае сов- падения сравниваемых значений и False — в случае их несовпадения. Такой спо- соб сравнения на равенство выполняется быстрее, чем вычитание арифметических значений и последующая проверка на нулевой результат. В табл. 14.11 приводится перечень описанных функций.

Таблица 14.11

Формат обращения

Пояснение

iv:=CompareDate(dt1,dt2);

Арифметическое сравнение календарных дат

bv:=SameDate(dt1,dt2);

Логическое сравнение календарных дат

Таблица 14.11 (окончание)

Формат обращения

Пояснение

iv:=CompareTime(dt1,dt2);

Арифметическое сравнение времени дня

bv:=SameTime(dt1,dt2);

Логическое сравнение времени дня

iv:=CompareDateTime(dt1,dt2);

Арифметическое сравнение обеих составляющих

bv:=SameDateTime(dt1,dt2);

Логическое сравнение обеих составляющих

Функция IsSameDay(dt1,dt2) дублирует результат работы функции SameDate, т. к. возвращает значение True только в случае совпадения года, месяца и дня, представленных в обоих операндах.

Не так уж и целесообразна функция IsToday(dt), которая проверяет, совпадает ли календарная дата, указанная в dt, с данными сегодняшнего дня. Ее использова- ние эквивалентно вызову SameDate(dt,Now).

К  группе  процедур  сравнения разумно  отнести серию логических функций,

имена которых начинаются с сочетания WithinPast. Они выделяют из двух своих аргументов dt1 и dt2 формата TDateTime одноименные компоненты календарной даты или показаний часов и сравнивают абсолютную величину их разности с за- данным рассогласованием. Если разница дат по указанному компоненту не превос- ходит допустимое значение, то функция возвращает True. При этом следует пом- нить, что выделяемый компонент никак не связывается со значениями соседних полей и рассматривается как целое число. Если, например, сравнение ведется по годам, то абсолютная разница в 1 год и 364 дня считается равной одному году. В этом можно убедиться на следующем примере (листинг 14.6).

   Листинг 14.6. Программа  date6                                               

program date6;

uses DateUtils, SysUtils; var

dt1,dt2: TDateTime;

fmt: string=’ddddd tt';

s1: string=’WithinPastYears(dt1,dt2,1) = ‘; s2: string=’WithinPastYears(dt2,dt1,1) = ‘;

begin

dt1:=EncodeDate(2009,1,1); dt2:=EncodeDate(2010,12,31);

writeln(‘dt1 = ‘,FormatDateTime(fmt,dt1)); writeln(‘dt2 = ‘,FormatDateTime(fmt,dt2)); writeln(s1,WithinPastYears(dt1,dt2,1)); writeln(s2,WithinPastYears(dt2,dt1,1); readln;

end.

Далее приводится протокол работы программы date6.pas:

Running "e:\fpc\myprog\date6.exe " dt1 = 01.01.2009 0:00:00

dt2 = 31.12.2010 0:00:00

WithinPastYears(dt1,dt2,1) = TRUE WithinPastYears(dt2,dt1,1) = TRUE

Список функций типа WithinPast… приведен в табл. 14.12.

Таблица 14.12

Формат обращения

Проверка

WithinPastYears(dt2,dt1,dY);

|Y(dt1)-Y(dt2)| ≤ dY

WithinPastMonths(dt1,dt2,dMon);

|Mon(dt1)-Mon(dt2)| ≤

dMon

WithinPastWeeks(dt1,dt2,dW);

|W(dt1)-W(dt2)| ≤ dW

WithinPastDays(dt1,dt2,dD);

|D(dt1)-D(dt2)| ≤ dD

WithinPastHours(dt1,dt2,dH);

|H(dt1)-H(dt2)| ≤ dH

WithinPastMinutes(dt1,dt2,dMin);

|Min(dt1)-Min(dt2)| ≤

dMin

WithinPastSeconds(dt1,dt2,dS);

|S(dt1)-S(dt2)| ≤ dS

WithinPastMilliSeconds(dt1,dt2,dMls);

|Mls(dt1)-Mls(dt2)| ≤

dMls

Из других функций, которые можно условно отнести к группе процедур сравне- ния, отметим две — IsInLeapYear(dt) и IsPM(dt). Первая определяет принадлеж- ность даты dt високосному году. Вторая возвращает значение False, если показа- ния часов не достигли полудня, и True, если временная составляющая в dt пере- шагнула полуденный рубеж.

Юлианский календарь

Работу с юлианскими датами обеспечивают две функции, реализующие прямое и обратное преобразования между значениями типа TDateTime и типа Double:

var

jd : Double;

dt : TDateTime;

jd := DateTimeToJulianDate(dt);

dt := JulianDateToDateTime(jd);

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

По теме:

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