Вопросы и ответы - Delphi - Работа с датами и временем - Библиотека программиста
Пользователь

Добро пожаловать,

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

Меню сайта




Ваше мнение
Какой язык программирования вы используете ?

ASP
Delphi
C/C++
Basic
PHP
Pascal
Java
Другой


Результаты
Другие опросы

Всего голосов: 1970
Комментарии: 10


Наши партнеры



Статистика




Programming books  Download software  Documentation  Scripts  Content Managment Systems(CMS)  Templates  Icon Sets  Articles  Contacts  Voting  Site Search




Вопросы и ответы - Delphi - Работа с датами и временем

   
 
Вывод даты в нужном формате
Код
function CheckDateFormat(SDate: string): string;

var

IDateChar: string;

x, y: integer;

begin

IDateChar := '.,/';

for y := 1 to length(IDateChar) do

begin

x := pos(IDateChar[y], SDate);

while x > 0 do

begin

Delete(SDate, x, 1);

Insert('-', SDate, x);

x := pos(IDateChar[y], SDate);

end;

end;

CheckDateFormat := SDate;

end;





function DateEncode(SDate:string):longint;

var

year, month, day: longint;

wy, wm, wd: longint;

Dummy: TDateTime;

Check: integer;

begin

DateEncode := -1;

SDate := CheckDateFormat(SDate);

Val(Copy(SDate, 1, pos('-', SDate) - 1), day, check);

Delete(Sdate, 1, pos('-', SDate));

Val(Copy(SDate, 1, pos('-', SDate) - 1), month, check);

Delete(SDate, 1, pos('-', SDate));

Val(SDate, year, check);

wy := year;

wm := month;

wd := day;

try

Dummy := EncodeDate(wy, wm, wd);

except

year := 0;

month := 0;

day := 0;

end;

DateEncode := (year * 10000) + (month * 100) + day;

end;

Вычисление даты Пасхи
Код
function Easter(Year: Integer): TDateTime;

{----------------------------------------------------------------}

{ Вычисляет и возвращает день Пасхи определенного года. }

{ Идея принадлежит Mark Lussier, AppVision <MLussier@best.com>. }

{ Скорректировано для предотвращения переполнения целых, если по }

{ ошибке передан год с числом 6554 или более. }

{----------------------------------------------------------------}



var

nMonth, nDay, nMoon, nEpact, nSunday,

nGold, nCent, nCorx, nCorz: Integer;

begin

{ Номер Золотого Года в 19-летнем Metonic-цикле: }

nGold := (Year mod 19) + 1;

{ Вычисляем столетие: }

nCent := (Year div 100) + 1;

{ Количество лет, в течение которых отслеживаются високосные года... }

{ для синхронизации с движением солнца: }

nCorx := (3 * nCent) div 4 - 12;

{ Специальная коррекция для синхронизации Пасхи с орбитой луны: }

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}
Генерация еженедельных списков задач
Мне необходима программа, которая генерировала бы еженедельные списки задач. Программа должна просто показывать количество недель в списке задач и организовывать мероприятия, не совпадающие по времени. В моем текущем планировщике у меня имеется 12 групп и планы на 11 недель.

Мне нужен простой алгоритм, чтобы решить эту проблему. Какие идеи?

Вот рабочий код (но вы должны просто понять алгоритм работы):

Код
unit Unit1;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;



type

TForm1 = class(TForm)

ListBox1: TListBox;

Edit1: TEdit;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



const

maxTeams = 100;

var

Teams: array[1..maxTeams] of integer;

nTeams, ix, week, savix: integer;



function WriteBox(week: integer): string;

var

str: string;

ix: integer;

begin

Result := Format('Неделя=%d ', [week]);

for ix := 1 to nTeams do

begin

if odd(ix) then

Result := Result + ' '

else

Result := Result + 'v';

Result := Result + IntToStr(Teams[ix]);

end;

end;



procedure TForm1.Button1Click(Sender: TObject);

begin

nTeams := StrToInt(Edit1.Text);

if Odd(nTeams) then

inc(nTeams); {должны иметь номера каждой группы}

ListBox1.Clear;

for ix := 1 to nTeams do

Teams[ix] := ix;

ListBox1.Items.Add(WriteBox(1));



for week := 2 to nTeams - 1 do

begin

Teams[1] := Teams[nTeams - 1];

{используем Teams[1] в качестве временного хранилища}

for ix := nTeams downto 2 do

if not Odd(ix) then

begin

savix := Teams[ix];

Teams[ix] := Teams[1];

Teams[1] := savix;

end;

for ix := 3 to nTeams - 1 do

if Odd(ix) then

begin

savix := Teams[ix];

Teams[ix] := Teams[1];

Teams[1] := savix;

end;

Teams[1] := 1; {восстанавливаем известное значение}

ListBox1.Items.Add(WriteBox(week));

end;

end;



end.
Дни в месяце
Код
// Колическтво дней в любом месяце любого

// года можно получить с помощью EndOfAMonth



var

YYYY, MM, DD: Word;

D: TDateTime;

begin

DecodeDate(Date, YYYY, MM, DD);

D := EndOfAMonth(YYYY, {Номер месяца});

DecodeDate(D, YYYY, MM, DD); // DD - номер последнего дня в месяце

end;
За какое время было создано изображение
При нажатии на Button1 используется свойство Pixels, а при нажатии на Button2 - ScanLine. В заголовок окна выводится время в миллисекундах, за которое было создано изображение.

Код
procedure TForm1.Button1Click(Sender: TObject);

var

t: cardinal;

x, y: integer;

bm: TBitmap;

begin

bm := TBitmap.Create;

bm.PixelFormat := pf24bit;

bm.Width := Form1.ClientWidth;

bm.Height := Form1.ClientHeight;

t := GetTickCount;

for y := 0 to bm.Height - 1 do

for x := 0 to bm.Width - 1 do

bm.Canvas.Pixels[x,y] := RG