Entwickler-Ecke

Sonstiges (Delphi) - DatetoWeek und umgekehrt - wo?


AXMD - Mo 24.02.03 16:54
Titel: DatetoWeek und umgekehrt - wo?
Hi,

es gab mal irgendwo (!) die Funktionen DatetoWeek und WeektoDate - waren jeweils nur wenige (wenn überhaupt nur eine) Zeilen lang. Könnte mir das jemand posten? Ich verzweifle nach hoffnungsloser Suche :bawling:

AXMD


LCS - Di 25.02.03 09:38

Hi
Wenn du Delphi 6 verwendest, hast du doch die Funktion WeekOfTheYear schon dabei. Ansonsten kannst du damit die Woche nach ISO berechnen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
function ISOWeekNumber(AYear, AMonth, ADay: Word; CMode: integer): integer;
const
  dOffset  : array[1..7] of Byte = (6, 7, 8, 9, 10, 4, 5);
var
  Present, StartOfYear  : TDateTime;
   FirstDayOfYear, WeekNumber, NumberOfDays, RYearOfWeekNumber: integer;
begin
  Present      := EncodeDate(AYear, AMonth, ADay);
   StartOfYear    := ENcodeDate(AYear, 1, 1);
   FirstDayOfYear  := dOffset[DayOfWeek(StartOfYear)];
   NumberOfDays  := Trunc(Present - StartOfYear) + FirstDayOfYear;
   WeekNumber    := NumberOfDays div 7;
   if  WeekNumber = 0 then
     Result := ISOWeekNumber(AYear - 1, 12, 31, CMode)
   else begin
     RYearOfWeekNumber  := AYear;
       if  WeekNUmber = 53 then begin
         if  DayOfWeek( EncodeDate(AYear, 12, 31) ) < 5 then begin
             RYearOfWeekNumber := AYear + 1;
               WeekNumber := 1;
           end;
       end;
       if  CMode = 1 then
         Result := WeekNumber
       else
         Result := RYearOfWeekNumber;
   end;
end;

Der Parameter CMode = 1 liefert die die Wochennummer des angegebenen Datums. CMode = 0 liefert das Jahr in das die Woche fällt (Nur sinnvoll bei der 1. Woche)

Datum des Montags der angegebenen Woche

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function ISOWeekDate(AWeek, AYear: integer): TDateTime;
const
  dOffset  : array[1..7] of Byte = (6, 7, 8, 9, 10, 4, 5);
var
  StartOfYear  : TDateTime;
   FirstDayOfYear  : integer;
begin
  StartOfYear    := EncodeDate(AYear, 1, 1);
   FirstDayOfYear  := dOffset[DayOfWeek(StartOfYear)];
   Result      := StartOfYear + (AWeek * 7) - FirstDayOfYear;
end;

Achtung: Die Funktion habe ich jetzt mehr oder weniger aus dem Stehgreif heraus geschrieben. Ist also nicht voll getestet :?

Gruss Lothar


AXMD - Mi 26.02.03 08:49

Hi,

danke erst mal. Habe leider heute keine Zeit mehr, die Funktion zu testen, aber vielleicht morgen.
Vielen Dank,
AXMD