Delphi - Hányadik hét van az adott dátumon az éven belül?

forráskód letöltése
A címben megfogalmazott kérdésre keressük a választ programból. Készítünk egy olyan függvényt, mely egy tetszőleges dátum alapján kiszámítja, hogy az hányadik hét az adott évben.
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.
  count:=count+day;
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;