Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 3
>
> nCorz := (8 * nCent + 5) div 25 – 5;
> { Находим воскресенье: }
> nSunday := (Longint(5) * Year) div 4 – ncorx – 10;
> { ^ Предохраняем переполнение года за отметку 6554}
> { Устанавливаем Epact – определяем момент полной луны: }
> nEpact := (11 * nGold + 20 + nCorz – nCorx) mod 30;
> if nepact < 0 then nEpact := nEpact + 30;
> if ((nepact = 25) and (ngold > 11)) or (nepact = 24) then nEpact := nEpact + 1;
> { Ищем полную луну: }
> nMoon := 44 – nEpact;
> if nmoon < 21 then nMoon := nMoon + 30;
> { Позиционируем на воскресенье: }
> nMoon := nMoon + 7 – ((nSunday + nMoon) mod 7);
> if nmoon >l 31 then
> begin
> nMonth := 4;
> nDay := nMoon – 31;
> end
> else
> begin
> nMonth := 3;
> nDay := nMoon;
> end;
> Easter := EncodeDate(Year, nMonth, nDay);
>end; {easter}
Преобразование даты в количество секунд
Delphi 1
EncodeDate возвращает объект TDateTime, который просто является double-числом. Для получения количества миллисекунд с даты 1/1/0001, умножьте результат на 86400000.0 Но чтобы избежать переполнения, лучше пользоваться более поздней датой.
Преобразование даты в неделю
Delphi 1
>procedure TForm1.Button1Click(Sender: TObject);
>var frstDay,toDay : TDateTime; week : Integer;
>begin
> frstDay := StrToDate('1/1/96');
> toDay := StrToDate(Edit1.Text);
> week := Trunc((toDay - frstDay) / 7) + 1;
> Label1.Caption := IntToStr(week);
>end;
Преобразование даты
Delphi 1
>procedure TForm1.Button1Click(Sender: TObject);
>var
> st,formatsave : string;
> DT : TDateTime;
>begin
> st := Edit1.text; // '1996-06-03 00.00.00'
> formatsave := ShortDateFormat;
> ShortDateFormat := 'yyyy.mm.dd hh.mm.ss';
> while pos ('-', st) > 0 do st [pos ('-', st)] := '.';
> DT := StrToDateTime(st);
> ShortDateFormat := formatsave;
> Label1.Caption := DateTimeToStr(DT);
>end;
Преобразование даты — добавление столетия
Delphi 1
>LongDate := FormatDateTime('ddmmyyyy', StrToDate(ShortDate));
Данный код преобразует дату, переданную в формате, определенном в виде короткой даты в Панели Управления (типа DD/MM/YY) в формат, заданный в строке Format (в нашем примере DDMMYYYY).
Если DD/MM/YY — входное поле, а DDMMYYYY — поле базы данных, то приведенный выше код может сослужить пользователю хорошую службу, если он вдруг захочет использовать другой формат даты, с его соответствующим переопределением в Панели Управления.
(Естественно, YYYYMMDD для поля базы данных при обычных обстоятельствах будет лучше чем DDMMYYYY, поскольку в настоящее время используется метод последовательной сортировки).
Приведение даты
Delphi 1
>procedure TForm1.MaskEdit1Exit(Sender: TObject);
>var
> y, m, d : word;
>begin
> decodedate(strtodate(maskedit1.text) + 11, y, m, d);
> maskedit2.text := inttostr(m) + '/' + inttostr(d) + '/' + inttostr(y);
>end;
Даты и недели
Delphi 1
У меня есть программа, которая делает примерно то, что вы хотите. Она сообщает для даты текущую неделю и день недели. Вам необходимо лишь реализовать вычисление предела для дат недели. Кроме того, формат в этом коде для дат задан в виде "06/25/1996".
Вы должны создать форму с именем "Forma", компонентом TEdit с именем "Edit1", четырьмя метками и кнопкой с именем "GetWeekBtn". Убедитесь в том, что обработчиком события формы OnCreate является метод FormCreate.
Надеюсь, что помог вам.
>unit Forma;
>interface
>uses
> SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls;
>type
> TForma1 = class(TForm)
> Edit1: TEdit;
> Label1: TLabel;
> Label2: TLabel;
> Label3: TLabel;
> GetWeekBtn: TButton;
> Label4: TLabel;
> procedure GetWeekBtnClick(Sender: TObject);
> procedure FormCreate(Sender: TObject);
> private { Private declarations }
> Function HowManyDays(pYear,pMonth,pDay:word):integer;
> public { Public declarations }
> end;
>var
> Forma1: TForma1;
>implementation
> {$R *.DFM}
>Uses Inifiles;
>procedure TForma1.FormCreate(Sender: TObject);
> var WinIni:TInifile;
>begin
> WinIni:=TIniFile.Create('WIN.INI');
> WinIni.WriteString('intl','sShortDate','MM/dd/yyyy');
> WinIni.Free;
>end;
>Function TForma1.HowManyDays(pYear,pMonth,pDay:word):integer;
> var Sum:integer;
> pYearAux:word;
>begin
> Sum:=0;
> if pMonth>1 then Sum:=Sum+31;
> if pMonth>2 then Sum:=Sum+28;
> if pMonth>3