A válasz megadásához több másik kérdést is el kell tudnunk dönteni majd programból. Az egyik ilyen, hogy a megadott év vajon szökőév-e vagy sem. Ehhez készítünk egy IsLeapYear függvényt, mely paraméterként az év számát várja és logikai értékként adja vissza, hogy szökőévről van-e szó.
function IsLeapYear(year: integer): boolean;
begin
result:=(year mod 4=0) and ((year mod 100<>0) or (year mod 400=0));
end;
Másik ilyen kérdés, hogy hány nap van egy adott hónapban. Ez szökőév és február hónap esetén okoz csak némi bonyodalmat.
function MonthDays(year, month: integer): integer;
const
DaysPerMonth: array[1..12] of integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
if (month=2) and IsLeapYear(year) then begin
result:=29;
end else begin
result:=DaysPerMonth[month];
end;
end;
Végül már foglalkozhatunk az alapkérdéssel. A válasz megadásához tudnunk kell először is, hogy az adott dátumig hány nap telt el az adott évben.
function WeekOfYear(date: TDateTime): integer;
begin
count:=0;
DecodeDate(date, year, month, day);
Ehhez egy ciklussal összeadjuk az egész hónapok napjainak számát.
for i:=1 to month-1 do begin
count:=count+MonthDays(year, i);
end;
Végül hozzáadjuk az adott dátum hónapjában eltelt napok számát. Ekkor a count változóban már rendelkezésre áll, hogy hány nap telt el az évből.
Az eredményhez osztjuk a count értékét héttel, majd hozzáadunk egyet, hogy az első hét ne a nulla szám legyen és már készen is vagyunk.
result:=count div 7+1;
end;
A függvényünket felhasználni igen egyszerű: paraméterként adjunk számára egy TDateTime típusú dátumot, majd visszatérési értékként kapunk egy integer számot, melyből megtudhatjuk, hogy hányadik hétre is esik az adott dátum.
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption:=IntToStr(WeekOfYear(Now));
end;