Ich habe mal (vor 20 Jahren oder so: Grauenvolle Nomenklatur) diesen Code produziert. Bisher hat sich auch noch niemand beschwert, und etwas einfacher und verständlicher als der Code vom Mathematiker ist er auch. Vielleicht stimmt die Berechnugn für das Jahr 6592 nicht, aber mir ist das wurscht.
Delphi-Quellcode:
Function CsGetWeek(_Date: TDateTime): Word;
// Zunächst wird die KW des 1.1 des Jahres ermittelt.
// Sind in der ersten KW des Jahres mehr als vier Tage,
// dann ist dies die KW 1, sonst die KW '0' bzw.
// die KW des 31.12. des vorherigen Jahres.
Var
MondayOfKW1,
FirstOfJanuary: TDateTime;
Dow, KW, y, m, d: Word;
Begin
DecodeDate(_Date, y, m, d);
FirstOfJanuary := EncodeDate(Y, 1, 1);
Dow := SysUtils.DayOfWeek(FirstOfJanuary);
If Dow <= 5 Then
MondayOfKW1 := FirstOfJanuary - Dow + 1
Else
MondayOfKW1 := FirstOfJanuary + 8 - Dow;
KW := Trunc(_Date - MondayOfKW1) Div 7 + 1;
If KW < 1 Then
KW := CsGetWeek(EncodeDate(Y - 1, 12, 31))
Else If KW = 53 Then
If SysUtils.DayOfWeek(EncodeDate(Y + 1, 1, 1)) <= 4 Then KW := 1;
Result := KW;
End;