Author: Tomas Rutkauskas
How to calculate the current week
Answer:
Solve 1:
There are 2 other functions included which are required for our function. One 
checks for a leap year, the other returns the number of days in a month (checking 
the leap year) and the third is the one you want, the week of the year.
1   function kcIsLeapYear(nYear: Integer): Boolean;
2   begin
3     Result := (nYear mod 4 = 0) and ((nYear mod 100 <> 0) or (nYear mod 400 = 0));
4   end;
5   
6   function kcMonthDays(nMonth, nYear: Integer): Integer;
7   const
8     DaysPerMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 
9   30, 31);
10  begin
11    Result := DaysPerMonth[nMonth];
12    if (nMonth = 2) and kcIsLeapYear(nYear) then
13      Inc(Result);
14  end;
15  
16  function kcWeekOfYear(dDate: TDateTime): Integer;
17  var
18    X, nDayCount: Integer;
19    nMonth, nDay, nYear: Word;
20  begin
21    nDayCount := 0;
22    DecodeDate(dDate, nYear, nMonth, nDay);
23    for X := 1 to (nMonth - 1) do
24      nDayCount := nDayCount + kcMonthDays(X, nYear);
25    nDayCount := nDayCount + nDay;
26    Result := ((nDayCount div 7) + 1);
27  end;
Solve 2:
28  
29  function CalendarWeek(ADate: TDateTime): integer;
30  
31  {Author: Ralph Friedman (ralphfriedman@email.com)
32  
33  Calculates calendar week assuming:
34  Monday is the 1st day of the week
35  The 1st calendar week is the 1st week of the year that contains a Thursday
36  
37  -1 result indicates error.
38  Any other negative result indicates week 52 or 53 of the previous year.}
39  
40  var
41    day: word;
42    dayOne: word;
43    firstOfYear: TDateTime;
44    month: word;
45    monthOne: word;
46    prevDayOne: word;
47    year: word;
48  begin
49    Result := -1;
50    try
51      DecodeDate(ADate, year, month, day);
52    except
53      Exit;
54    end;
55    case DayOfWeek(EncodeDate(year, 1, 1)) of
56      1: dayOne := 2; {Sunday}
57      2: dayOne := 1; {Monday}
58      3: dayOne := 31; {Tuesday}
59      4: dayOne := 30; {Wednesday}
60      5: dayOne := 29; {Thursday}
61      6: dayOne := 4; {Friday}
62      7: dayOne := 3; {Saturday}
63    else
64      dayOne := 0;
65    end;
66    case DayOfWeek(EncodeDate(year - 1, 1, 1)) of
67      1: prevDayOne := 2; {Sunday}
68      2: prevDayOne := 1; {Monday}
69      3: prevDayOne := 31; {Tuesday}
70      4: prevDayOne := 30; {Wednesday}
71      5: prevDayOne := 29; {Thursday}
72      6: prevDayOne := 4; {Friday}
73      7: prevDayOne := 3; {Saturday}
74    else
75      prevDayOne := 0;
76    end;
77    if (prevDayOne = 0) or (dayOne = 0) then
78      Exit;
79    if dayOne > 4 then
80    begin
81      Dec(year);
82      monthOne := 12
83    end
84    else
85      monthOne := 1;
86    firstOfYear := EncodeDate(year, monthOne, dayOne);
87    if (ADate < firstOfYear) then
88      if (PrevDayOne > 4) then
89        Result := -53
90      else
91        Result := -52
92    else
93      Result := (Trunc(ADate - firstOfYear) div 7) + 1;
94  end;
			
           |